[Rd] ScalarLogical and setAttrib
Jeroen Ooms
jeroen.ooms at stat.ucla.edu
Fri Oct 31 23:58:38 CET 2014
Is it expected that attributes set on a LGLSXP created by
ScalarLogical will apply to all future objects created by
ScalarLogical as well? For example: the 'test1' function below returns
FALSE and 'test2' returns FALSE with an attribute:
library(inline)
test1 <- cfunction(body = 'return ScalarLogical(0);')
test2 <- cfunction(body = '
SEXP success = PROTECT(ScalarLogical(0));
setAttrib(success, install("foo"), mkString("bar"));
UNPROTECT(1);
return success;
')
However after running test2(), then test1() will also return the attribute:
> test1()
[1] FALSE
> test2()
[1] FALSE
attr(,"foo")
[1] "bar"
> test1()
[1] FALSE
attr(,"foo")
[1] "bar"
It seems like ScalarLogical returns a singleton object, which is not
the case for ScalarInteger or ScalarReal. I am currently working
around this using duplicate(ScalarLogical(0)), but was quite surprised
by this behavior of ScalarLogical.
More information about the R-devel
mailing list