[Rd] Unexpected behavior of '[' in an apply instruction

Sokol Serguei @oko| @end|ng |rom |n@@-tou|ou@e@|r
Fri Feb 12 23:49:50 CET 2021


Le 12/02/2021 à 22:23, Rui Barradas a écrit :
> Hello,
>
> Yes, although there is an accepted solution, I believe you should post 
> this solution there. It's a base R solution, what the question asks for.
>
> And thanks, I would have never reminded myself of slice.index.

There is another approach -- produce a call to `[`() putting there 
"required number of commas in their proper places" programmatically. 
Even if it does not lead to a very readable expression, I think it 
merits to be mentioned.

   x <- array(1:60, dim = c(10, 2, 3))
   ld=length(dim(x))
   i=1 # i.e. the first row but can be a slice 1:5, whatever
   do.call(`[`, c(alist(x, i), alist(,)[rep(1,ld-1)], alist(drop=FALSE)))

Best,
Serguei.

>
> Rui Barradas
>
> Às 20:45 de 12/02/21, robin hankin escreveu:
>> Rui
>>
>>  > x <- array(runif(60), dim = c(10, 2, 3))
>>  > array(x[slice.index(x,1) %in% 1:5],c(5,dim(x)[-1]))
>>
>> (I don't see this on stackoverflow; should I post this there too?)  
>> Most of the magic package is devoted to handling arrays of arbitrary 
>> dimensions and this functionality might be good to include if anyone 
>> would find it useful.
>>
>> HTH
>>
>> Robin
>>
>>
>> <mailto:hankin.robin using gmail.com>
>>
>>
>> On Sat, Feb 13, 2021 at 12:26 AM Rui Barradas <ruipbarradas using sapo.pt 
>> <mailto:ruipbarradas using sapo.pt>> wrote:
>>
>>     Hello,
>>
>>     This came up in this StackOverflow post [1].
>>
>>     If x is an array with n dimensions, how to subset by just one 
>> dimension?
>>     If n is known, it's simple, add the required number of commas in 
>> their
>>     proper places.
>>     But what if the user doesn't know the value of n?
>>
>>     The example below has n = 3, and subsets by the 1st dim. The 
>> apply loop
>>     solves the problem as expected but note that the index i has
>>     length(i) > 1.
>>
>>
>>     x <- array(1:60, dim = c(10, 2, 3))
>>
>>     d <- 1L
>>     i <- 1:5
>>     apply(x, MARGIN = -d, '[', i)
>>     x[i, , ]
>>
>>
>>     If length(i) == 1, argument drop = FALSE doesn't work as I 
>> expected it
>>     to work, only the other way does:
>>
>>
>>     i <- 1L
>>     apply(x, MARGIN = -d, '[', i, drop = FALSE)
>>     x[i, , drop = FALSE]
>>
>>
>>     What am I missing?
>>
>>     [1]
>> https://stackoverflow.com/questions/66168564/is-there-a-native-r-syntax-to-extract-rows-of-an-array
>>
>>     Thanks in advance,
>>
>>     Rui Barradas
>>
>>     ______________________________________________
>>     R-devel using r-project.org <mailto:R-devel using r-project.org> mailing list
>>     https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list