在 r 中分配函数的替代方法
Alternative to assign function in 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))
}
}
我面临的问题是,我不想在第二步中分配,而是想使用 (eval+paste)
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。我看了看论坛,到处都建议使用 assign 来解决问题。但是,如果我使用分配循环覆盖我以前生成的 "numeric_data" 而不是添加到它,因此我只得到 i 的一个值而不是两个值的输出。
这里是对 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_1
、object_2
等,它们几乎应该总是单个列表中的元素具有您可以轻松构造和引用的名称。
我在循环中使用以下代码,我只是在复制我遇到问题的部分。整个代码非常长,我删除了中间 运行 好的部分这些线。这只是为了说明问题:
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))
}
}
我面临的问题是,我不想在第二步中分配,而是想使用 (eval+paste)
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。我看了看论坛,到处都建议使用 assign 来解决问题。但是,如果我使用分配循环覆盖我以前生成的 "numeric_data" 而不是添加到它,因此我只得到 i 的一个值而不是两个值的输出。
这里是对 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_1
、object_2
等,它们几乎应该总是单个列表中的元素具有您可以轻松构造和引用的名称。