Re: [Rd] ScalarLogical and setAttrib
I believe this is by design (and changed relatively recently). FALSE and TRUE are singletons, like NULL. Hadley. On Friday, October 31, 2014, Jeroen Ooms jeroen.o...@stat.ucla.edu wrote: 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. __ R-devel@r-project.org javascript:; mailing list https://stat.ethz.ch/mailman/listinfo/r-devel -- http://had.co.nz/ [[alternative HTML version deleted]] __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] ScalarLogical and setAttrib
Hi, The problem is better illustrated with: library(inline) test2 - cfunction(body = ' SEXP success = PROTECT(ScalarLogical(0)); setAttrib(success, install(foo), mkString(bar)); UNPROTECT(1); return success; ') test3 - cfunction(body = ' SEXP success = PROTECT(ScalarLogical(0)); LOGICAL(success)[0] = 1; UNPROTECT(1); return success; ') Then: test2() [1] FALSE attr(,foo) [1] bar test3() [1] TRUE attr(,foo) [1] bar Looks like someone assumed that the SEXP returned by ScalarLogical() would never be touched before being returned to R (which is probably true 99% of the time but not 100%). Cheers, H. On 10/31/2014 03:58 PM, Jeroen Ooms wrote: 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. __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel -- Hervé Pagès Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpa...@fredhutch.org Phone: (206) 667-5791 Fax:(206) 667-1319 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Re: [Rd] ScalarLogical and setAttrib
Hi, The problem is better illustrated with: library(inline) test2 - cfunction(body = ' SEXP success = PROTECT(ScalarLogical(0)); setAttrib(success, install(foo), mkString(bar)); UNPROTECT(1); return success; ') test3 - cfunction(body = ' SEXP success = PROTECT(ScalarLogical(0)); LOGICAL(success)[0] = 1; UNPROTECT(1); return success; ') Then: test2() [1] FALSE attr(,foo) [1] bar test3() [1] TRUE attr(,foo) [1] bar Looks like someone assumed that the SEXP returned by ScalarLogical() would never be touched before being returned to R (which is probably true 99% of the time but not 100%). Cheers, H. On 10/31/2014 03:58 PM, Jeroen Ooms wrote: 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. __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel -- Hervé Pagès Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpa...@fredhutch.org Phone: (206) 667-5791 Fax:(206) 667-1319 __ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel