2016-08-22 48 views
1

我在循环中使用下面的代码,我只是复制了我面临问题的部分。整个代码非常长,并且我已经删除了在两者之间运行良好的部分这些线。这只是说明问题:在r中替代分配函数

for (j in 1:2) 
    { 
     assign(paste("numeric_data",j,sep="_"),unique_id) 
     for (i in 1:2) 
     { 
     assign(paste("numeric_data",j,sep="_"), 
       merge(eval(as.symbol(paste("numeric_data",j,sep="_"))), 
       eval(as.symbol(paste("sd_1",i,sep="_"))),all.x = TRUE)) 
     } 
     } 

,我现在面临的问题是不是在第二步中分配,我想

for (j in 1:2) 
    { 
     assign(paste("numeric_data",j,sep="_"),unique_id) 
     for (i in 1:2) 
     { 
     eval(as.symbol((paste("numeric_data",j,sep="_"))))<- 
       merge(eval(as.symbol(paste("numeric_data",j,sep="_"))), 
       eval(as.symbol(paste("sd_1",i,sep="_"))),all.x = TRUE) 
     } 
     } 

但是[R不使用(EVAL +粘贴)在分配新变量时不接受eval。我看了论坛,并且无处不在分配建议解决问题。但是,如果我使用assign循环覆盖我以前生成的“numeric_data”而不是添加到它,因此我得到的只有一个值的输出,而不是两者。

+1

我不确定我会考虑使用'eval'“normal”。 – nrussell

+0

当然,让我删除该注释 – Shaz

+0

您不必删除它;我的意思是,你为什么要特意使用'eval'? – nrussell

回答

2

这是R中最基本的数据结构的一个非常基本的介绍。我强烈建议在标准文档资源中阅读更多关于它们的内容。

#A list is a (possible named) set of objects 
numeric_data <- list(A1 = 1, A2 = 2) 
#I can refer to elements by name or by position, e.g. numeric_data[[1]] 
> numeric_data[["A1"]] 
[1] 1 

#I can add elements to a list with a particular name 
> numeric_data <- list() 
> numeric_data[["A1"]] <- 1 
> numeric_data[["A2"]] <- 2 
> numeric_data 
$A1 
[1] 1 

$A2 
[1] 2 

#I can refer to named elements by building the name with paste() 
> numeric_data[[paste0("A",1)]] 
[1] 1 

#I can change all the names at once... 
> numeric_data <- setNames(numeric_data,paste0("B",1:2)) 
> numeric_data 
$B1 
[1] 1 

$B2 
[1] 2 

#...in multiple ways 
> names(numeric_data) <- paste0("C",1:2) 
> numeric_data 
$C1 
[1] 1 

$C2 
[1] 2 

基本上,教训是,如果你有带数字后缀名称的对象:object_1object_2,等他们应该几乎总是在一个列表元素与名称,你可以轻松地构建和参考至。

+0

我跳过图片:D + 1,尽管这可能不回答OP的问题。但我想它指向了正确的方向。 – RHertel

+1

@RHertel找出一种方法来帮助那些编码自己进入这个角落的人对我来说一直是一个难题。我试着回答很多不同的方式,但可能唯一真正的方法就是坐在键盘上,一起看整个代码。 – joran

+0

它没有回答我的问题,但它给了我一个不同的想法来解决问题 – Shaz