[Rd] No error when assigning values to an "empty" vector/matrix/array

Henrik Bengtsson hb at biostat.ucsf.edu
Fri Oct 24 15:34:07 CEST 2014


On Oct 24, 2014 1:59 AM, "Hervé Pagès" <hpages at fhcrc.org> wrote:
>
> Hi Henrik,
>
>
> On 10/23/2014 08:10 PM, Henrik Bengtsson wrote:
>>
>> Assigning one or more values to a vector/matrix/array x for which
>> length(x) == 0 gives no error, e.g.
>>
>>> x <- integer(0)
>>> x[] <- 1:2
>>
>>
>>> x <- matrix(nrow=0, ncol=1)
>>> x[] <- 1:2
>>> x[,1] <- 1:2
>>
>>
>>> x <- array(dim=c(0,1,1))
>>> x[] <- 1:2
>>> x[,1,1] <- 1:2
>>
>>
>> whereas
>>
>>> x <- integer(1)
>>> x[] <- 1:2
>>
>> Warning message:
>> In x[] <- 1:2 :
>>    number of items to replace is not a multiple of replacement length
>>>
>>> x <- matrix(nrow=1, ncol=1)
>>> x[] <- 1:2
>>
>> Warning message:
>> In x[] <- 1:2 :
>>    number of items to replace is not a multiple of replacement length
>>>
>>> x[,1] <- 1:2
>>
>> Error in x[, 1] <- 1:2 :
>>    number of items to replace is not a multiple of replacement length
>>>
>>> x <- array(dim=c(1,1,1))
>>> x[] <- 1:2
>>
>> Warning message:
>> In x[] <- 1:2 :
>>    number of items to replace is not a multiple of replacement length
>>>
>>> x[,1,1] <- 1:2
>>
>> Error in x[, 1, 1] <- 1:2 :
>>    number of items to replace is not a multiple of replacement length
>>
>> Is this intended by design or is it a bug that should be reported?
>
>
> Since [<- supports truncating of the right value, why an exception
> should be made when the left vector has length 0?
>
> Also note that these warnings or errors are complaining that the number
> of items to replace (left length) is not a multiple of replacement
> length (right length). This suggests that when the left length is a
> multiple of the right length, everything is fine.
> And this is actually the case when the left length is 0. Because
> 0 is a multiple of anything. So in that case, the right value is
> truncated to length 0 and no warning is issued. Makes sense to me.

Thanks Hervé, you gave the perfect explanation/rationale for this being
consistent.

Henrik

PS. The background to my question was that I had a function that populated
a zero-row matrix column by column with values. These values were in turn
generated by another function that incorrectly read all values available in
for when indeed requestion zero (treating NULL ["read all"] and integer(0)
["read none"] equally). An implementation error that indeed gave the
correct value in the end, although in an extremely inefficient way.

>
> Cheers,
> H.
>
>>
>> /Henrik
>>
>> ______________________________________________
>> 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 fhcrc.org
> Phone:  (206) 667-5791
> Fax:    (206) 667-1319

	[[alternative HTML version deleted]]



More information about the R-devel mailing list