I suspect this will have suboptimal performance since the TRUEs will get recycled. (Maybe there is, or could be, ALTREP, support for recycling) Hadley
On Fri, Jun 8, 2018 at 10:16 AM, Berry, Charles <ccbe...@ucsd.edu> wrote: > > >> On Jun 8, 2018, at 8:45 AM, Hadley Wickham <h.wick...@gmail.com> wrote: >> >> Hi all, >> >> Is there a better to way to subset the ROWs (in the sense of NROW) of >> an vector, matrix, data frame or array than this? > > > You can use TRUE to fill the subscripts for dimensions 2:nd > >> >> subset_ROW <- function(x, i) { >> nd <- length(dim(x)) >> if (nd <= 1L) { >> x[i] >> } else { >> dims <- rep(list(quote(expr = )), nd - 1L) >> do.call(`[`, c(list(quote(x), quote(i)), dims, list(drop = FALSE))) >> } >> } > > > subset_ROW <- > function(x,i) > { > mc <- quote(x[i]) > nd <- max(1L, length(dim(x))) > mc[seq(4, length=nd-1L)] <- rep(list(TRUE), nd - 1L) > mc[["drop"]] <- FALSE > eval(mc) > > } > >> >> subset_ROW(1:10, 4:6) >> #> [1] 4 5 6 >> >> str(subset_ROW(array(1:10, c(10)), 2:4)) >> #> int [1:3(1d)] 2 3 4 >> str(subset_ROW(array(1:10, c(10, 1)), 2:4)) >> #> int [1:3, 1] 2 3 4 >> str(subset_ROW(array(1:10, c(5, 2)), 2:4)) >> #> int [1:3, 1:2] 2 3 4 7 8 9 >> str(subset_ROW(array(1:10, c(10, 1, 1)), 2:4)) >> #> int [1:3, 1, 1] 2 3 4 >> >> subset_ROW(data.frame(x = 1:10, y = 10:1), 2:4) >> #> x y >> #> 2 2 9 >> #> 3 3 8 >> #> 4 4 7 >> > > HTH, > > Chuck > -- http://hadley.nz ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel