【问题标题】:Alternative to assign function in r在 r 中分配函数的替代方法
【发布时间】:2016-08-22 19:31:24
【问题描述】:

我在循环中使用以下代码,我只是在复制我面临问题的部分。整个代码非常长,我删除了在这些行之间运行良好的部分。这只是为了说明问题:

    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 的一个值而不是两者的输出。

【问题讨论】:

  • 我不确定我是否会考虑使用eval“正常”。
  • 好的,让我删除那句话
  • 您不必删除它;我的意思是,你为什么要专门使用eval?
  • ...assign“正常”的随意使用也不是。点名名单!点名名单!点名名单! (想象一下我像个大傻瓜一样上下跳跃,挥舞着我的手臂。)
  • 我认为这个问题的一个主要困难是它被表述为XY problem。

标签: r loops assign dynamic-variables


【解决方案1】:

这里是对 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 等。它们几乎总是是单个列表中的元素,其名称可以方便地构造和引用。

【讨论】:

  • 我想象你在跳跃 :D +1 虽然这可能无法回答 OP 的问题。但我想它指向了正确的方向。
  • @RHertel 找到一种方法来帮助那些将自己编码到这个特定角落的人一直是我的难题。我尝试过多种不同的回答方式,但可能唯一真正有帮助的方法是和他们一起坐在键盘前,一起查看整个代码。
  • 它没有回答我的问题,但它给了我一个不同的想法来解决这个问题
猜你喜欢
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2017-03-18
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多