使用lazyeval进行mutate标准评估

时间:2015-07-09 08:33:19

标签: r dplyr standard-evaluation

我试图让自己的函数包装dplyr函数。

我有一个数据框列表,我想用给定的标签修改指定变量的级别(两者都应该是函数的参数)。

这是我到目前为止所尝试的:

library(plyr); library(dplyr)

groups <- list(label1 = "setosa", label2 = c("virginica", "versicolor"))

iris$Species <- as.character(iris$Species)
x <- lapply(1:5, function(x) iris)

f <- function(datas, fillVar, groups) {

  fillStr <- deparse(substitute(fillVar))

  datas <- llply(datas, function(x) {
    x <- mutate_(x, .dots = setNames(list(lazyeval::interp(~ factor(var), var = substitute(fillStr))), fillStr))
    levels(x[,fillStr]) <- groups
    return(x)})

  return(datas)
}

f(x, Species, groups)

 Error in mutate_impl(.data, dots) : object 'Species' not found 

但是我无法让它发挥作用,我只是不明白为什么...... 你知道我错过了什么吗?感谢。

1 个答案:

答案 0 :(得分:3)

尝试

f1 <- function(datas, fillVar, groups) {
  fillStr <- deparse(substitute(fillVar))
  datas <- llply(datas, function(x) {
     x <- mutate_(x, .dots = setNames(list(lazyeval::interp(~ factor(var),
                var = as.name(fillStr))), fillStr))
    levels(x[fillStr]) <- groups
    x})
   return(datas)
}

 identical(f(x, 'Species', groups), f1(x, Species, groups))
 #[1] TRUE