From @oko| @end|ng |rom |n@@-tou|ou@e@|r  Sat Feb 13 00:08:48 2021
From: @oko| @end|ng |rom |n@@-tou|ou@e@|r (Sokol Serguei)
Date: Sat, 13 Feb 2021 00:08:48 +0100
Subject: [Rd] Unexpected behavior of '[' in an apply instruction
In-Reply-To: <8de49c5d-8e9b-31fd-4c2b-212db94a2ccf@insa-toulouse.fr>
References: <a8eac065-c1ea-a165-2d92-c4802b4d0373@sapo.pt>
 <CAHHjBM5PhQfxw3xSZXxuQAuWqTi83eN=EiuCQC7rtC35bS3R9A@mail.gmail.com>
 <f13cf55f-1210-cfb6-bf74-ea73fcaaa707@sapo.pt>
 <8de49c5d-8e9b-31fd-4c2b-212db94a2ccf@insa-toulouse.fr>
Message-ID: <1a3b16a2-c3ca-6189-e353-3e6b6e2b9131@insa-toulouse.fr>

Le 12/02/2021 ? 23:49, Sokol Serguei a ?crit?:
> 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)))

Or slightly shorter:

 ? do.call(`[`, alist(x, i, ,drop=FALSE)[c(1,2,rep(3,ld-1),4)])

>
> 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 at gmail.com>
>>>
>>>
>>> On Sat, Feb 13, 2021 at 12:26 AM Rui Barradas <ruipbarradas at sapo.pt 
>>> <mailto:ruipbarradas at 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 at r-project.org <mailto:R-devel at r-project.org> mailing list
>>> ??? https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



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