我如何使用变量参数和函数来使用标准评估版本的dplyr中的summarise_
使得do.call
函数能够正常工作?
## Some sample data, function, and variables to interpolate
set.seed(0)
dat <- data.frame(a=runif(10), b=runif(10))
fn <- function(x, y) IQR(x / y, na.rm = TRUE)
funs <- list(fn="fn")
targs <- list("a", "b")
这是我正在尝试使其正常工作的 lazyeval::interp
library(dplyr)
interp(~do.call(fn, xs), .values=list(fn=funs$fn, xs=targs))
# ~do.call("fn", list("a", "b"))
但它不起作用,
dat %>%
summarise_(out = interp(~do.call(fn, xs), .values=list(fn=funs$fn, xs=targs)))
期望的结果
dat %>%
summarise(out = do.call(fn, list(a, b)))
# out
# 1 1.084402
如果我添加一些打印语句,我知道问题是“a”和“b”没有被正确解释,但我还没有找到如何正确引用它们的方法。
fn <- function(x, y) { print(x); print(y); IQR(x / y, na.rm = TRUE) }
dat %>%
summarise_(out = interp(~do.call(fn, xs), fn=funs$fn, xs=targs))
# [1] "a"
# [1] "b"
# Error: non-numeric argument to binary operator
interp
结构的吸引力),但是dat %>% summarise(out = do.call(fn, unname(.[unlist(targs)])))
可以用来获取list(a,b)
,或者dat %>% summarise(out = do.call(fn, lapply(targs, function(x) .[[x]])))
。 - Frankdo.call
吗?它不能只是像这样dat %>% summarise_(out = interp(~f(x,y), f = as.name(funs$fn), x = as.name(targs[[1]]), y = as.name(targs[[2]])))
吗? - talatdo.call
。 - aosmitheval(parse(text=...))
范式可能会起作用,将targs = "list(a, b)"
,但这将创建相同的问题,其中a
仍然被解释为"a"
。有时使用没有引号的字符串是 R 的祸根,会产生无尽的问题。 - Mike Williamsongroup_by
才能使其正常运行? - Sam Dickson