[Rd] Subsetting the "ROW"s of an object
Berry, Charles
ccberry @ending from uc@d@edu
Fri Jun 8 23:49:51 CEST 2018
> On Jun 8, 2018, at 2:15 PM, Hadley Wickham <h.wickham using gmail.com> wrote:
>
> On Fri, Jun 8, 2018 at 2:09 PM, Berry, Charles <ccberry using ucsd.edu> wrote:
>>
>>
>>> On Jun 8, 2018, at 1:49 PM, Hadley Wickham <h.wickham using gmail.com> wrote:
>>>
>>> Hmmm, yes, there must be some special case in the C code to avoid
>>> recycling a length-1 logical vector:
>>
>>
>> Here is a version that (I think) handles Herve's issue of arrays having one or more 0 dimensions.
>>
>> subset_ROW <-
>> function(x,i)
>> {
>> dims <- dim(x)
>> index_list <- which(dims[-1] != 0L) + 3
>> mc <- quote(x[i])
>> nd <- max(1L, length(dims))
>> mc[ index_list ] <- list(TRUE)
>> mc[[ nd + 3L ]] <- FALSE
>> names( mc )[ nd+3L ] <- "drop"
>> eval(mc)
>> }
>>
>> Curiously enough the timing is *much* better for this implementation than for the first version I sent.
>>
>> Constructing a version of `mc' that looks like `x[i,,,,drop=FALSE]' can be done with `alist(a=)' in place of `list(TRUE)' in the earlier version but seems to slow things down noticeably. It requires almost twice (!!) as much time as the version above.
>
> I think that's probably because alist() is a slow way to generate a
> missing symbol:
>
> bench::mark(
> alist(x = ),
> list(x = quote(expr = )),
> check = FALSE
> )[1:5]
> #> # A tibble: 2 x 5
> #> expression min mean median max
> #> <chr> <bch:tm> <bch:tm> <bch:tm> <bch:tm>
> #> 1 alist(x = ) 2.8µs 3.54µs 3.29µs 34.9µs
> #> 2 list(x = quote(expr = )) 169ns 219.38ns 181ns 24.2µs
>
> (note the units)
Yes. That is good for about half the difference. And I guess the rest is getting rid of seq(). This seems a bit quicker than anything else and satisfies Herve's objections:
subset_ROW <-
function(x,i)
{
dims <- dim(x)
nd <- length(dims)
index_list <- if (nd > 1) 2L + 2L:nd else 0
mc <- quote(x[i])
mc[ index_list ] <- list(quote(expr=))
mc[[ "drop" ]] <- FALSE
eval(mc)
}
Chuck
More information about the R-devel
mailing list