[Rd] Subsetting the "ROW"s of an object

Hadley Wickham h@wickh@m @ending from gm@il@com
Fri Jun 8 23:15:20 CEST 2018


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)

Hadley


-- 
http://hadley.nz



More information about the R-devel mailing list