【发布时间】:2013-08-13 00:13:47
【问题描述】:
我不太清楚为什么数据框对象没有更新
d <- data.frame(titi=c(0))
(function(dataset) {
dataset[["toto"]] <- 1;
print(names(dataset)) #has "toto" and "titi"
})(d)
print(names(d)) # no has "toto", only "titi"
这是怎么回事?
我有一个解决方法,因为在我的代码中我还捕获了变量并使用 <<- 更新捕获的变量,但我想知道机制。
我知道一般突变的危险等等。我只是不明白这里的机制。
编辑
虽然这似乎是一个语言级别的特性的共识,但我不遵循这个论点,好像我使用了一个封闭的结构,数据表,它可以变异:
d <- data.table(titi=c(0))
(function(dataset) {
dataset[,toto:=1]
print(names(dataset)) #"titi" "toto"
})(d)
print(names(d)) #"titi" "toto"
【问题讨论】:
-
R 中的函数不会“就地”或“通过引用”更改数据。如果您希望该函数更改“d”,那么您需要将其输出分配给“d”。使用
<<-绕过 R 的这种设计被认为是危险和丑陋的。 -
所以根据我是否在函数内部,我的 instruction 有不同的含义?
-
您的函数复制了
d(命名为dataset),添加了新列,然后丢弃了结果。正如@Dwin 所说,您需要分配函数输出。 -
请定义“意义”。它有不同的环境,相同的地方“意义”。
-
'data.frame' 对象只是列表的一种形式。在特定于具有“data.frame
.data.table”类的列表的函数中使用<<-没有任何意义,对象在设计上有所不同,大多数R对象和R函数都不像' data.table' 对象或函数。