Dado que está construyendo dinámicamente un nombre de variable como un valor de carácter, tiene más sentido hacer la asignación utilizando la indexación de data.frame estándar que permite valores de caracteres para los nombres de columna. Por ejemplo:
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df[[varname]] <- with(df, Petal.Width * n)
df
}
La mutate
función hace que sea muy fácil nombrar nuevas columnas a través de parámetros con nombre. Pero eso supone que conoce el nombre cuando escribe el comando. Si desea especificar dinámicamente el nombre de la columna, también debe crear el argumento con nombre.
versión dplyr> = 0.7
La última versión de dplyr
(0.7) hace esto usando :=
para asignar dinámicamente nombres de parámetros. Puedes escribir tu función como:
# --- dplyr version 0.7+---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
mutate(df, !!varname := Petal.Width * n)
}
Para obtener más información, consulte el formulario de documentación disponible vignette("programming", "dplyr")
.
dplyr (> = 0.3 y <0.7)
La versión ligeramente anterior de dplyr
(> = 0.3 <0.7), fomentó el uso de alternativas de "evaluación estándar" para muchas de las funciones. Consulte la viñeta de evaluación no estándar para obtener más información ( vignette("nse")
).
Entonces, la respuesta es usar en mutate_()
lugar de mutate()
y hacer:
# --- dplyr version 0.3-0.5---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
varval <- lazyeval::interp(~Petal.Width * n, n=n)
mutate_(df, .dots= setNames(list(varval), varname))
}
dplyr <0.3
Tenga en cuenta que esto también es posible en versiones anteriores de las dplyr
que existían cuando la pregunta se planteó originalmente. Requiere un uso cuidadoso de quote
y setName
:
# --- dplyr versions < 0.3 ---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
pp <- c(quote(df), setNames(list(quote(Petal.Width * n)), varname))
do.call("mutate", pp)
}