R-数据帧或全局变量的有趣问题
看看这段代码。我试图使代码以一个只有ID的空数据帧开始,并动态添加数据。例如,假设它以R-数据帧或全局变量的有趣问题,r,list,dataframe,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 请看下面的代码。所需的最终的总计变量为: ID a 1 1 4 2 2 NA 3 3 NA 但最后
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
请看下面的代码。所需的最终的总计变量为:
ID a
1 1 4
2 2 NA
3 3 NA
但最后,total
只是
ID
1 1
2 2
3 3
这是代码。为什么total
没有保留它添加的内容?在该方法的末尾,total是正确的,但是在该方法之后,total返回到id。这是代码,下面是输出
# 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)
方法结束后,total
为什么会丢失该列a
transform(total, a = {b=rep(NA,N); b[1] <- 4;b })
ID a
1 1 4
2 2 NA
3 3 NA
不幸的是,当将
与
一起使用时,转换
更适合于控制台使用,而不是编程。编码使用并不完全安全。因为在R中,在维加斯发生的事情留在维加斯(除非你告诉别人)。现在将“Vegas”替换为“function”。函数中发生的一切都是在函数创建的环境中发生的,当您退出函数时,该环境将被丢弃。addPair
仅获取一列数据帧,对其进行操作,并显示所发生的操作;什么也救不了。一个快速修复方法是使用,您可能更惊讶的是,当您的函数运行total[,toString(name)]=rep(NA,N)
行时,它首先将total
复制到函数中的本地环境中,然后对其进行修改。不要听@alexis\u laz。使用@DWin:我同意“小心
transform(total, a = {b=rep(NA,N); b[1] <- 4;b })
ID a
1 1 4
2 2 NA
3 3 NA
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