传递一个字符向量作为summarize_at的funs参数

时间:2016-08-31 15:54:42

标签: r dplyr

我正在处理一个带有参数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)"))

1 个答案:

答案 0 :(得分:1)

您需要使用公式(~)而不是字符串:

print(compute_box_value(x, vars, ~equals(., test_value = 1)))

给出了:

#  value
#1     3

来自documentation

  

最好使用公式,因为公式可以捕获两者   表达式评估和评估的环境   发生。如果表达式是变量的混合,这很重要   在数据框和本地环境中的对象: