R - 数据框或全局变量的有趣问题

时间:2013-11-01 19:33:12

标签: r list dataframe

看看这段代码。我正在尝试使用只有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

1 个答案:

答案 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更多是为控制台使用而设计的。编码使用并不完全安全。