Стандартная оценка с мутацией с использованием 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
Но я не могу заставить это работать, и я просто не понимаю, почему... Вы знаете, чего мне не хватает? Благодарю.
1 ответ
Решение
Пытаться
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