[Rd] Rubbish values written with zero-length vectors (PR#14217)
Peter Dalgaard
p.dalgaard at biostat.ku.dk
Sun Feb 21 10:07:26 CET 2010
OK. I now have a version which seems to do the trick and reuses an
existing error message. Will commit to r-devel if and when make
check-devel succeeds.
-p
Peter Dalgaard wrote:
> 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