Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-数据帧或全局变量的有趣问题_R_List_Dataframe - Fatal编程技术网

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

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的空数据帧开始,并动态添加数据。例如,假设它以

  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