如何在不重复对象名称的情况下为对象分配新值(直接覆盖)?

时间:2018-10-19 12:03:17

标签: r

我发现用于在R中冗余且笨拙地覆盖对象的代码。我想知道是否有任何快捷方式可以在不重复对象名称的情况下对对象进行修改或应用操作。这是一个示例:

如果df是带有名为monkey的列的数据框,例如,我想计算此类列的日志并覆盖其值。我会的

df$monkey=log(df$monkey)

是否有一种方法可以log(df$monkey)覆盖对象,就像简化为“覆盖对象”一样?当您拥有长名称的对象(例如df或列表列表)时,它将变得麻烦且缓慢,尤其是当您直接在控制台上工作或快速测试操作时。因此,我经常发现自己使用诸如ta之类的短对象名只是为了避免使用这种长语法。

2 个答案:

答案 0 :(得分:2)

对您问题的一般回答是“不,没有。”

但是:

首先,RStudio的自动完成功能对于使用长变量名提供了巨大的帮助。

在基数R中,您可以使用withwithin,但是只有在您需要多次分配时,它们才会保存键入内容:

iris <- within(iris, {
  Sepal.Length <- log(Sepal.Length)
  Sepal.Width <- log(Sepal.Width)
  })

我选择的替代方法是data.table包:

library(data.table)
setDT(iris)
iris[, Sepal.Length := log(Sepal.Length)]

我喜欢这种语法(避免多次写入data.table名称),它也非常有效(处理大数据)。

另一种替代方法是具有mutate和相关功能的dplyr软件包。

答案 1 :(得分:0)

我认为该功能可以回答您的问题:

ovw <- function(x, f) {
  assign(x , f(eval(parse(text=x))), .GlobalEnv)
}

longnamevar <- 1
ovw("longnamevar", log)
longnamevar
[1] 0

如果要使用log以外的其他功能,例如x/100,则可以执行以下操作:

ovw("longnamevar", function(x) x/100)
longnamevar
[1] 0.01

还可以与function(x) x+1一起使用,依此类推...请注意,在第一种情况下,log可以由function(x) log(x)替换,