【问题标题】:How to use generate variable name on fly without assignment?如何在没有赋值的情况下即时使用生成变量名?
【发布时间】:2019-11-20 21:45:47
【问题描述】:

我知道如何从这里生成变量并为其赋值:Create a variable name with "paste" in R?

但我不需要为生成的变量赋值,我需要使用生成名称的变量。 这是我的代码:

a1 <- 1
a2 <- 2
a3 <- 3
a4 <- 4
a5 <- 5

counter <- 1
while(counter <= 5)
{
  (paste0("a", counter) + 1)
  counter <- counter +1
}

问题:如何修改(paste0("a", counter) + 1),让上面的代码在控制台输出:

2
3
4
5
6

【问题讨论】:

  • 应该是sapply(mget(paste0("a", 1:5)), +, 1)
  • @akrun 你的意思是sapply(mget(paste0("a", 1:5)), +, 1)?如果是,它会给我错误:Error in source("~/.active-rstudio-document", echo = TRUE) : ~/.active-rstudio-document:10:35: unexpected ',' 9: { 10: sapply(mget(paste0("a", 1:5)), +,
  • 对不起,我的意思是+上的反引号
  • 你真的应该避免在 R 中使用这样的代码。在变量名中嵌入索引会使这些值更难处理。您最初是如何创建这些变量的?你应该重新考虑你的策略。
  • @akrun 谢谢。

标签: r variables metaprogramming


【解决方案1】:

您可以通过不同的方式将变量存储在列表中:

a <- setNames(as.list(1:5),paste0("a",1:5))

counter <- 1
while(counter <= 5)
{
  idx <- paste0("a",counter)
  print(a[[idx]] + 1)
  counter <- counter +1
}

【讨论】:

    【解决方案2】:

    另一种解决方案:在循环中,为每个 a* 分配一个新值,即它们的先前值 + 1。然后获取每个 a* 的值并打印它。最后,counter 增加一个单位。

    a1 <- 1
    a2 <- 2
    a3 <- 3
    a4 <- 4
    a5 <- 5
    
    counter <- 1
    while(counter <= 5)
    {
      assign(paste0("a", counter), counter + 1)
      print(get(paste0("a", counter)))
      counter <- counter + 1
    }
    

    【讨论】:

    • 我不明白为什么它被否决了。它完全按照我需要的方式完成。
    • 我不知道这个,谢谢你的评论,但为什么这是不好的做法?
    • 您的意思是讨论问题的cmets?我认为@MrFlick 意味着数据不应该有那种变量命名,应该首先更正。
    • 不,@joran 发表评论说使用 assignget 是不好的做法,所以我想知道原因,但显然他/她删除了他/她的评论
    • 也许你也有兴趣看看:stackoverflow.com/questions/58966113/…
    猜你喜欢
    • 2013-08-04
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多