在我的函数中,...
下面表示用户命名的所有矢量(例如numeric
或character
等)。例如,用户可以定义age = 1:3
和prof = c("med", "low", "med")
。这些额外的向量会添加到名为data.frame
的{{1}}中。
我想知道是否可以创建一个名为out
的新参数,以允许用户从最终输出extract
中子集化。
例如,如果用户想要对h
或age == 2
进行子集化,则使用age == 2 & prof == "low"
返回输出中的相应匹配项?
extract = age == 2 & prof == "low"
答案 0 :(得分:3)
这既不使用任何软件包,也不明确使用eval
。
foo2 <- function(d, per, ..., extract = TRUE) {
out <- data.frame(...)
h <- split(out, rep(seq_along(per), per))
s <- substitute(extract)
lapply(h, function(x) do.call("subset", list(x, s)))
}
foo2(d = 2:4, per = 1:2, age = 1:3, prof = c("med", "low", "med"), extract = age == 2)
答案 1 :(得分:2)
我们可以在'extract'和eval
uate中传递带引号的表达式以过滤行
library(tidyverse)
foo <- function(d, per, extract, ...){ ## Add a new argument called `extract`
extract <- rlang::enexpr(extract)
out <- data.frame(d, ...)
h <- split(out, rep(seq_along(per), per))
map(h, ~ .x %>%
filter(!! extract))
}
foo(d = 2:4, per = 1:2, extract = age == 2, age = 1:3, prof = c("med", "low", "med"))
#$`1`
#[1] d age prof
#<0 rows> (or 0-length row.names)
#$`2`
# d age prof
#1 3 2 low
或使用base R
foo <- function(d, per, extract, ...){ ## Add a new argument called `extract`
extract <- substitute(extract)
out <- data.frame(d, ...)
h <- split(out, rep(seq_along(per), per))
lapply(h, function(x) subset(x, subset = eval(extract)))
}
foo(d = 2:4, per = 1:2, extract = age == 2, age = 1:3, prof = c("med", "low", "med"))