From |uke-t|erney @end|ng |rom u|ow@@edu  Thu May 16 21:46:29 2019
From: |uke-t|erney @end|ng |rom u|ow@@edu (Tierney, Luke)
Date: Thu, 16 May 2019 19:46:29 +0000
Subject: [Rd] [External]  ALTREP: Bug reports
In-Reply-To: <CAGiFhPPjds+myJWKxfCBC_f3L+kSofnm+g3q73ntZ6v6=aATcg@mail.gmail.com>
References: <CAGiFhPPjds+myJWKxfCBC_f3L+kSofnm+g3q73ntZ6v6=aATcg@mail.gmail.com>
Message-ID: <alpine.DEB.2.21.1905161441540.2805@luke-Latitude-7480>

On Thu, 16 May 2019, ??? wrote:

> Hello,
>
> I have encountered two bugs when using ALTREP APIs.
>
> 1. STDVEC_DATAPTR
>
> From RInternal.h file it has a comment:
>
> /* ALTREP support */
>> void *(STDVEC_DATAPTR)(SEXP x);
>
>
> However, this comment might not be true, the easiest way to verify it is to
> define a C++ function:
>
> void C_testFunc(SEXP a)
>> {
>> STDVEC_DATAPTR(a);
>> }
>
>
> and call it in R via
>
>> a=1:10
>>> C_testFunc(a)
>> Error in C_testFunc(a) : cannot get STDVEC_DATAPTR from ALTREP object
>
>
> We can inspect the internal type and call ALTREP function to check if it
> is an ALTREP:
>
>> .Internal(inspect(a))
>> @0x000000001b5a3310 13 INTSXP g0c0 [NAM(7)]  1 : 10 (compact)
>>> #This is a wrapper of ALTREP
>>> is.altrep(a)
>> [1] TRUE
>
>
> I've also defined an ALTREP type and it did not work either. I guess this
> might be a bug? Or did I miss something?

STDVEC_DATAPTR returns the data pointer of a standard (non-ALTREP)
vector.  It should not be necessary to use it in package code; if you
callit on an ALTREP you are likely to get a segfault.

>
> 2. Wrapper objects in ALTREP
>
> If the duplicate function is defined to return the object itself:

Don't do that. Mutable objects don't work. Look at the vignette in
https://github.com/ALTREP-examples/Rpkg-mutable for more on this.

Best,

luke

>
> SEXP vector_dulplicate(SEXP x, Rboolean deep) {
> return(x);
> }
>
> In R an ALTREP object will behave like an environment (pass-by-reference).
> However, if we do something like(pseudo code):
>
> n=100
>> x=runif(n)
>> alt1=createAltrep(x)
>> alt2=alt1
>> alt2[1]=10
>> .Internal(inspect(alt1))
>> .Internal(inspect(alt2))
>
>
> The result would be:
>
>> .Internal(inspect(alt1))
>> @0x00000000156f4d18 14 REALSXP g0c0 [NAM(7)]
>>> .Internal(inspect(alt2 ))
>> @0x00000000156a33e0 14 REALSXP g0c0 [NAM(7)]  wrapper
>> [srt=-2147483648,no_na=0]
>>   @0x00000000156f4d18 14 REALSXP g0c0 [NAM(7)]
>
>
> It seems like the object alt2 automatically gets wrapped by R. Although at
> the R level it seems fine because there are no differences between alt1 and
> alt2, if we define a C function as:
>
> SEXP C_peekSharedMemory(SEXP x) {
>> return(R_altrep_data1(x));
>
> }
>
>
> and call it in R to get the internal data structure of an ALTREP object.
>
> C_peekSharedMemory(alt1)
>> C_peekSharedMemory(alt2)
>
>
> The first one correctly returns its internal data structure, but the second
> one returns the ALTREP object it wraps since the wrapper itself is an
> ALTREP. This behavior is unexpected. Since the dulplicate function returns
> the object itself, I will expect alt1 and alt2 should be the same object.
> Even if they are essentially not the same, calling the same function should
> at least return the same result. Other than that, It seems like R does not
> always wrap an ALTREP object. If we change n from 100 to 10 and check the
> internal again, alt2 will not get wrapped. This makes the problem even more
> difficult since we cannot predict when would the wrapper appear.
>
> Here is the source code for the wrapper:
> https://github.com/wch/r-source/blob/trunk/src/main/altclasses.c#L1399
>
> Here is a working example if one can build the sharedObject package from
> https://github.com/Jiefei-Wang/sharedObject
>
> n=100
>> x=runif(n)
>> so1=sharedObject(x,copyOnWrite = FALSE)
>> so2=so1
>> so2[1]=10
>> .Internal(inspect(so1))
>> .Internal(inspect(so2))
>
>
> Here is my session info:
>
> R version 3.6.0 alpha (2019-04-08 r76348)
>> Platform: x86_64-w64-mingw32/x64 (64-bit)
>> Running under: Windows >= 8 x64 (build 9200)
>> Matrix products: default
>> locale:
>> [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United
>> States.1252
>> [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
>>
>> [5] LC_TIME=English_United States.1252
>> attached base packages:
>> [1] stats     graphics  grDevices utils     datasets  methods   base
>> other attached packages:
>> [1] sharedObject_0.0.99
>> loaded via a namespace (and not attached):
>> [1] compiler_3.6.0 tools_3.6.0    Rcpp_1.0.1
>
>
> Best,
> Jiefei
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Luke Tierney
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney at uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu


[Rd] [External] ALTREP: Bug reports
Tierney, Luke