我正在尝试在dplyr中使用标准评估,并在全局环境中使用函数,但是我得到了"找不到函数"错误。这是一些代码
# create data.frame
df <- data.frame(x = rnorm(10), y=rnorm(10))
# define arbitrary function
test <- function(x) x^2
# use standard evaluation with dplyr
df %>% mutate_("mean(x)")
df %>% mutate_("test(x)")
# Error in mutate_impl(.data, dots) : could not find function "test"
我可以通过使用df %>% mutate_(~test(x))
来解决这个问题,但我想出于各种原因使用基于字符串的方法。主要原因是用户可以将变量名x
的向量传递给我的函数。我可以使用此向量将相同的转换应用于所有变量,方法是将此类as.list(sprintf('mean(%s, na.rm=TRUE)', x))
传递给.dots
。这是完整的代码
x <- c('x','y')
df %>% mutate_(.dots=as.list(sprintf('mean(%s, na.rm=TRUE)', x)))
df %>% mutate_(.dots=as.list(sprintf('test(%s, na.rm=TRUE)', x)))
所以我的问题是为什么基于字符串的方法不适用于全局环境中的函数?我能做些什么才能让它发挥作用?或者是否可以采用基于公式的方法,以便它适用于变量名称的向量?
R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] magrittr_1.5 dplyr_0.3.0.2 plyr_1.8.1 maptools_0.8-30 sp_1.0-16 Rcpp_0.11.3
[7] matrixStats_0.10.0 rgeos_0.3-8 stringr_0.6.2 mvtnorm_1.0-0 RcppArmadillo_0.4.400.0 Defaults_1.1-1
loaded via a namespace (and not attached):
[1] assertthat_0.1 DBI_0.3.1 foreign_0.8-61 grid_3.1.1 lattice_0.20-29 lazyeval_0.1.9 parallel_3.1.1 R.methodsS3_1.6.1
[9] tools_3.1.1