使用 lazyeval 进行变异的标准评估
Standard Evaluation with mutate using lazyeval
我正在尝试使我自己的函数包装 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
但我无法让它工作,我只是不明白为什么...
你知道我错过了什么吗?谢谢
尝试
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
我正在尝试使我自己的函数包装 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
但我无法让它工作,我只是不明白为什么... 你知道我错过了什么吗?谢谢
尝试
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