-1

看看这段代码。我正在尝试制作以只有 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不保留它添加的内容?在方法结束时,total 是正确的,但是在方法之后,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

4

1 回答 1

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

不幸的是,在使用时withtransform更多的是为控制台使用而设计的,而不是编程。编码使用并不完全安全。

于 2013-11-01T20:09:43.447 回答