我正在处理一个带有参数funs
的函数,该函数是一串函数,应用于一组变量vars
。最简单的方法似乎是使用dplyr' summarize_at
和SE版funs
函数。
这适用于内置R的功能,但似乎不适用于用户定义的功能。它报告错误,它无法找到用户定义的功能。但是,summarize_at
在完成后会正常工作"手动。"
此功能是更大功能的一部分,可为闪亮仪表板生成一个框。对于每种类型的盒子(每个功能和功能参数组合),我不希望(并且必须维护)不同的Shiny模块。
以下是一个可重复性最小的例子:
# function to compute summary stat
compute_box_value <- function(data, vars, funs) {
f = funs_(funs)
result <- data %>%
summarize_at(.cols = vars, .funs = f)
}
# simple user defined function that gets count of rows with certain values of x
equals <- function(x, test_value) {
sum(x %in% test_value)
}
x <- data.frame(value = sample(1:5, 10, TRUE))
vars <- c("value")
# this works
print(compute_box_value(x, vars, "mean(., na.rm = TRUE)"))
# this works
summarize_at(x, vars, .funs = "equals", test_value = 1)
# this doesn't work (error: couldn't find function equals)
print(compute_box_value(x, vars, "equals(., test_value = 1)"))
答案 0 :(得分:1)
您需要使用公式(~
)而不是字符串:
print(compute_box_value(x, vars, ~equals(., test_value = 1)))
给出了:
# value
#1 3
最好使用公式,因为公式可以捕获两者 表达式评估和评估的环境 发生。如果表达式是变量的混合,这很重要 在数据框和本地环境中的对象: