R 使用lazyeval进行标准评估

R 使用lazyeval进行标准评估,r,dplyr,standard-evaluation,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

我正在尝试制作自己的函数来包装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 
library(plyr);图书馆(dplyr)
组Try


f1
x@akrun
plyr::mutate
不存在,似乎不是名称空间问题。你是对的,我没有注意到,但是
f(x,'Species',groups)
是有效的,但是我想在我的函数中保留“dplyr函数语法”,如果可能的话,将变量作为参数unquoted传递
as.name
正是我需要的。你解决了我的问题,现在这一步起作用了,你让我意识到我的函数并没有达到我想要的效果。当我修复它时,我将进行编辑。@Juliennavare可能是您需要返回
x
,即
levels(x[fillStr])您完全正确,我必须使用
levels(x[,fillStr])
而不是
levels(x[fillStr])
进行级别分配。@Juliennavare我刚刚检查了
levels(x[,fillStr
,它使用
作为.name创建了一个NA列
解决方案我使用
级别(x[,fillStr])
获得了预期的输出,并且使用
级别(x[fillStr])
没有更改级别(我认为您获得NAs是因为您使用
替换(fillStr)
否?)
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