看看这段代码。我正在尝试使用只有ID的空数据帧开始编写代码并动态添加数据。例如,假设它以
开头 ID
1 1
2 2
3 3
然后我打个电话
addPair(1,"a",4); #sets the value of column "a" at row 1 to be the value 4
它会变成
ID a
1 1 4
2 2 NA
3 3 NA
请看下面的代码。 所需最终total
变量为:
ID a
1 1 4
2 2 NA
3 3 NA
但最后,total
只是
ID
1 1
2 2
3 3
这是代码。为什么total
不能保留它添加的内容?在方法结束时,总数是正确的,但在该方法之后,总数回到IDs
。这是代码,下面是输出。
# rm(list=ls()) # that code _should_ always be commented out
#get all the IDs
IDs = c("1","2","3")
N = length(IDs)
#the big data frame
total <- data.frame("ID"=IDs)
addPair = function(i,name,val) {
total[,toString(name)] = rep(NA,N)
total[,toString(name)][i] = val
print("end")
print(total)
}
addPair(1,"a",4)
print("after call")
print(total)
这是输出:
[1] "end"
ID a
1 1 4
2 2 NA
3 3 NA
> print("after call")
[1] "after call"
> print(total)
ID
1 1
2 2
3 3
为什么total
在方法结束后会丢失该列a
?
答案 0 :(得分:0)
transform(total, a = {b=rep(NA,N); b[1] <- 4;b })
ID a
1 1 4
2 2 NA
3 3 NA
返回所需的对象,但除非您将值赋给该名称,否则它不会更改total
。
addPair <- function(df,item,name, val) transform(
df, name={t=rep(NA,nrow(df)); t[item]=val;t} )
addPair(total, 1,"a",4)
ID name
1 1 4
2 2 NA
3 3 NA
> total <- addPair(total, 1,"a",4)
> total
ID name
1 1 4
2 2 NA
3 3 NA
不幸的是,在使用with
时,transform
更多是为控制台使用而设计的。编码使用并不完全安全。