[Rd] Rubbish values written with zero-length vectors (PR#14217)

Peter Dalgaard p.dalgaard at biostat.ku.dk
Sun Feb 21 09:36:22 CET 2010


seth at userprimary.net wrote:

Thanks, Seth. Martin Morgan sent a patch for a few lines above yours, 
which I didn't have a chance to review until now:

-   if (!isVectorList(x) && LENGTH(y) > 1)
-       error(_("more elements supplied than there are to replace"));
+   if (!isVectorList(x) && LENGTH(y) != 1)
+       if (LENGTH(y) == 0)
+           error(_("fewer elements supplied than there are to replace"));
+       else
+           error(_("more elements supplied than there are to replace"));

I _think_ that you are both right that there is no way for a zero-length 
RHS not to be an error. E.g.,

 > x[[0]] <- real(0)
Error in x[[0]] <- real(0) : attempt to select less than one element

The difference between Seth's solution and Martin's is whether to 
pre-check for nsubs==1, and I don't think we want that because of

 > x <- matrix(1:4,2,2)
 > x[[2,2]]
[1] 4
 > x[[2,2]] <- integer(0)
 > x
      [,1]      [,2]
[1,]    1         3
[2,]    2 142000760


> On 2/20/10 7:50 AM, Peter Dalgaard wrote:
>> You don't want to understand, believe me! ;-)
>>
>> It's a bug, probably not the very worst kind, but accessing memory that
>> isn't yours is potentially harmful (but writing to it is considerably
>> worse).
>>
>> Looks like the issue only concerns the right hand side; nothing to do
>> with the auto-expansion of v. I also get
>>
>>> v <- integer(0)
>>> u <- integer(1)
>>> u[[2]] <-v
>>> u
>> [1]         0 142000760
>>> u[[1]] <-v
>>> u
>> [1] 142000760 142000760
>>> a <- 1
>>> a[[1]] <-v
>>> a
>> [1] 142000760
> 
> I'm thinking this should be an error.  Similar to:
> 
>> v = 1
>> v[[1]] = integer(3)
> Error in v[[1]] = integer(3) :
>   more elements supplied than there are to replace
> 
> But instead not enough elements supplied.  Perhaps:
> 
>> v[[1]] = integer()
> Error in v[[1]] = integer() : [[ ]] replacement has zero length
> 
> The code in do_subassign2_dflt currently does not check that the
> replacement has length > 0 for the nsubs == 1 case.  I think we want:
> 
> 
> @@ -1529,6 +1532,8 @@ do_subassign2_dflt(SEXP call, SEXP op, SEXP args,
> SEXP rho)
>         if (nsubs == 0 || CAR(subs) == R_MissingArg)
>             error(_("[[ ]] with missing subscript"));
>         if (nsubs == 1) {
> +            if (length(y) == 0)
> +                error(_("[[ ]] replacement has zero length"));
>             offset = OneIndex(x, thesub, length(x), 0, &newname,
> recursed ? len-1 : -1, R_NilValue);
>             if (isVectorList(x) && isNull(y)) {
>                 x = DeleteOneVectorListItem(x, offset);
> 
> 
> + seth
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



-- 
    O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
   c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
  (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



More information about the R-devel mailing list