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.
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.ooms at 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 at r-project.org <javascript:;> mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- http://had.co.nz/ [[alternative HTML version deleted]]
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 at 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: hpages at fredhutch.org
Phone: (206) 667-5791
Fax: (206) 667-1319
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 at 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: hpages at fredhutch.org
Phone: (206) 667-5791
Fax: (206) 667-1319