【发布时间】:2020-08-28 21:59:22
【问题描述】:
我想创建一个从不同环境更新数据框的函数。具体来说,我想使用Hmisc::label() 函数更新数据框的标签。
assign_label <- function(df, col) {
col <- rlang::as_name(rlang::ensym(col))
Hmisc::label(df[,col]) <- fetch_label(col)
}
fetch_label <- function(col) {
val <- c("mpg" = "MPG",
"hp" = "HP")
unname(val[col])
}
以下代码执行没有问题:assign_label(mtcars, hp)
但是,它实际上并没有改变调用环境中的数据框。我只是想不通如何让它达到我的想象。
理想情况下,我希望能够像这样将数据帧通过管道传递给该函数:
mtcars %>% assign_label(mpg)
【问题讨论】:
-
在前面,我不知道如何......但是你在这里打了一场艰苦的战斗,因为大多数 R 在参数是按值传递的范式下运行,而不是通过引用传递。
data.table按参考做事,也许你可以看看那里。如果您本身不需要帧并且可以处理environments,它们(总是)通过引用传递,因此根据您的用例,也许您可以朝那个方向转变。 -
我强烈建议您不要这样做。拥有在其作用域之外更新变量的函数并不是很实用,现在 R 中的大多数函数是如何工作的。最好返回具有更新值的对象,如果要保存它,只需重新分配给原始值即可。
-
如果您担心您的工具适用于较大的数据集,而 R 经常复制的优势是一个问题,那么...
data.table。