R 使用lazyeval进行标准评估
我正在尝试制作自己的函数来包装dplyr函数 我有一个数据帧列表,我想用给定的标签修改指定变量的级别(两者都应该是函数的参数) 这就是我迄今为止所尝试的: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
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
f1x@akrunplyr::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