Hi, I found the following issue in r-devel (2019-01-02 r75945): `foo<-` <- function(x, value) { bar(x) <- value * x x } `bar<-` <- function(x, value) { stopifnot(all(value / x == 1)) x + value } `foo<-` <- compiler::cmpfun(`foo<-`) `bar<-` <- compiler::cmpfun(`bar<-`) x <- c(2, 2) foo(x) <- 1 x # should be c(4, 4) #> [1] 3 3 If the functions are not compiled or the stopifnot call is removed, the snippet works correctly. So it seems that something is messing around with the references to "value" when the call to stopifnot gets compiled, and the wrong "value" is modified. Note also that if "x <- 2", then the result is correct, 4. Regards, -- I?aki ?car
I see this too; by bisection, it seems to have first appeared in r72943. Duncan Murdoch On 03/01/2019 2:18 p.m., I?aki Ucar wrote:> Hi, > > I found the following issue in r-devel (2019-01-02 r75945): > > `foo<-` <- function(x, value) { > bar(x) <- value * x > x > } > > `bar<-` <- function(x, value) { > stopifnot(all(value / x == 1)) > x + value > } > > `foo<-` <- compiler::cmpfun(`foo<-`) > `bar<-` <- compiler::cmpfun(`bar<-`) > > x <- c(2, 2) > foo(x) <- 1 > x # should be c(4, 4) > #> [1] 3 3 > > If the functions are not compiled or the stopifnot call is removed, > the snippet works correctly. So it seems that something is messing > around with the references to "value" when the call to stopifnot gets > compiled, and the wrong "value" is modified. Note also that if "x <- > 2", then the result is correct, 4. > > Regards, >
On 03/01/2019 3:37 p.m., Duncan Murdoch wrote:> I see this too; by bisection, it seems to have first appeared in r72943.Sorry, that was a typo. I meant r75943. Duncan Murdoch> > Duncan Murdoch > > On 03/01/2019 2:18 p.m., I?aki Ucar wrote: >> Hi, >> >> I found the following issue in r-devel (2019-01-02 r75945): >> >> `foo<-` <- function(x, value) { >> bar(x) <- value * x >> x >> } >> >> `bar<-` <- function(x, value) { >> stopifnot(all(value / x == 1)) >> x + value >> } >> >> `foo<-` <- compiler::cmpfun(`foo<-`) >> `bar<-` <- compiler::cmpfun(`bar<-`) >> >> x <- c(2, 2) >> foo(x) <- 1 >> x # should be c(4, 4) >> #> [1] 3 3 >> >> If the functions are not compiled or the stopifnot call is removed, >> the snippet works correctly. So it seems that something is messing >> around with the references to "value" when the call to stopifnot gets >> compiled, and the wrong "value" is modified. Note also that if "x <- >> 2", then the result is correct, 4. >> >> Regards, >> >