【问题标题】:How to change and assign the name of a list?如何更改和分配列表的名称?
【发布时间】:2022-01-05 10:07:59
【问题描述】:

如果我在这里有这个列表:

list1 <- list(2, "hello", c(3, 5, 4))

我有这个:

ff <- "Bar"

我想通过ff 将列表名称从"list1" 更改为"Bar"

【问题讨论】:

  • 这样做的目的是什么?动态更改变量名称通常是一个非常糟糕的主意。出于所有意图和目的,您应该将变量名称视为静态,并与您编写的代码相关联。事实上,大多数语言根本不允许这样做,而且有充分的理由。
  • 您应该为此使用(嵌套)列表。然后,您可以将新元素添加到循环内的列表中。更好的是不使用循环,而是使用诸如lapply 之类的函数生成列表。如果您可以展示您正在使用的实际数据,我们可以为您提供更具体的帮助。
  • 最后一条评论:您可以使用&lt;-= 进行分配,两者都可以工作并且是identical。但坚持一个,不要在整个代码中混合和匹配它们。
  • 正如@Konrad Rudolph 所建议的那样,通常您更喜欢其中一个应用功能,对于需要命名列表的情况,您可能希望使用 sapply 而不是 lapply,以便您的列表项根据您应用的值。小例子:sapply(c("Bar", "SAV"), FUN = function(x) "do something", simplify = FALSE, USE.NAMES = TRUE)

标签: r list assign


【解决方案1】:

您会为此目的使用(嵌套)列表。在最基本的情况下,这可能如下所示:

results = list()

for (var in c('foo', 'bar', 'baz')) {
    results[[var]] = list1
}

这将生成一个新列表,其中包含三个名为 foobarbaz 的项目,每个项目都是 list1 的副本。要访问各个值,您可以使用例如result$fooresult[['foo']](如果您将值的名称存储在变量中,则后者是必需的,因为通过 $ 访问不适用于右侧的变量)。

您可以根据自己的特定目的进行调整。请注意,在大多数情况下,循环将被更合适的函数替换。例如,使用replicate 会更好地完成上述操作:

result = setNames(replicate(3L, list1, simplify = FALSE), c('foo', 'bar', 'baz'))

无论哪种方式,都不要动态创建变量。对于这类问题,从来没有合适的解决方案。相反,它使代码更复杂,更难理解。为了使代码尽可能简单,变量只能在代码中显式地创建(即通过赋值或作为函数参数等)。

【讨论】:

    【解决方案2】:

    请注意,动态更改变量名称通常是一个非常糟糕的主意。出于所有意图和目的,您应该认为变量名称是静态的,并且与您编写的代码相关联。 (正如@Konrad Rudolph 评论的那样)。例如见https://www.techrepublic.com/blog/it-security/never-use-dynamic-variable-names/

    如果你真的想使用这个,你可以使用assign(ff,list1)。这将创建一个名为 Bar 的变量并包含列表

    【讨论】:

    • 在没有详细解释为什么这是一个坏主意之前,请不要轻率地回答这些误导性的问题。我们从这里的初学者那里收到了大量的问题,他们被误导编写这样的代码,因此最终得到了他们自己不再理解并需要帮助的代码。
    • 公平点。添加说明
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多