From jeroen.ooms at stat.ucla.edu  Fri Oct 31 23:58:38 2014
From: jeroen.ooms at stat.ucla.edu (Jeroen Ooms)
Date: Fri, 31 Oct 2014 15:58:38 -0700
Subject: [Rd] ScalarLogical and setAttrib
Message-ID: <CABFfbXvzf4QV6Tb5qi53ddJh_MEhJEDeb3aFwL=s-Nnnpe2okA@mail.gmail.com>

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.



[Rd] ScalarLogical and setAttrib
Jeroen Ooms