[Rd] Language definition question - order of argument side effects

Duncan Murdoch murdoch.duncan at gmail.com
Fri Sep 30 19:40:36 CEST 2011


On 30/09/2011 12:26 PM, Justin Talbot wrote:
> I'm interested in the difference between these two intuitively
> equivalent sequences that produce different results (in R version
> 2.13.1 (2011-07-08) 32-bit). I think R's reference counting
> optimization is causing this difference in behavior.
>
> >  a<- 1
> >  a+{a[1]<- 20}
> [1] 21
>
> >  a<- 1
> >  a[1]<- 1
> >  a+{a[1]<- 20}
> [1] 40
>
> Is one of these the "correct" answer, or is the order of side effects
> undefined in these statements? Section 4.3.3 of the R Language
> Definition just says that doing assignment in an argument to a
> function is "bad style", but doesn't say anything about evaluation
> order.
>
> In general, for primitive and internal functions, is a particular
> evaluation order for the arguments guaranteed?

In general, evaluation order is undefined.  I was surprised by the 
result, but I think you're right about the explanation.  In particular:

>  a<- 1
>  .Internal(inspect(a))
@4a06440 14 REALSXP g0c1 [NAM(2)] (len=1, tl=0) 1
>  a[1]<- 1
>  .Internal(inspect(a))
@4a06300 14 REALSXP g0c1 [NAM(1)] (len=1, tl=0) 1

The only difference is in the "named" value.

Duncan Murdoch



More information about the R-devel mailing list