【问题标题】:Return elements of list as independent objects in global environment将列表的元素作为全局环境中的独立对象返回
【发布时间】:2019-08-31 00:48:55
【问题描述】:

我有一个列表,并且想将列表中的元素分解为全局环境中的单独对象。

例如,我想要列表:

obj <- list(a=1:5, b=2:10, c=-5:5)

是三个单独的对象abc

我试图通过以下方式实现:

lapply(obj, FUN = function(x) names(x)[1] <<- x[1])

但它失败了,Error in names(x)[1] &lt;&lt;- x[1] : object 'x' not found

我怎样才能实现我的目标?

【问题讨论】:

    标签: r environments


    【解决方案1】:

    如果列表还不是命名列表,我们需要先设置名称,例如带有递增的字母。

    obj2 <- list(1:5, 2:10, -5:5)
    
    list2env(setNames(obj2, letters[seq(obj2)]), envir=.GlobalEnv)
    ls()
    # [1] "a"    "b"    "c"    "obj2"
    

    【讨论】:

      【解决方案2】:

      列表映射到环境有特殊功能:

      > obj <- list(a=1:5, b=2:10, c=-5:5)
      > ls()
      [1] "obj"
      > list2env(obj,globalenv())
      <environment: R_GlobalEnv>
      > ls()
      [1] "a"   "b"   "c"   "obj"
      

      P。 S. 这是我作为答案提供的评论

      【讨论】:

        【解决方案3】:

        这也可以:

        lapply(seq_along(obj), function(i) assign(names(obj)[i], obj[[i]], envir = .GlobalEnv))
        

        【讨论】:

        • 您可能需要obj[[i]],以便您分配向量,而不是一个元素列表。
        • 请不要 Dason's 做你想做的事,减少头痛。
        • @ricardo,请查看 Gregory 对您的问题的评论。 --(另一个)
        • 我从来不喜欢附加数据。是否有充分的理由打破这条规则?
        • @ricardo Gregory 的答案没有使用attach(这是一个坏主意,为什么我不推荐它)。再说一次,如果您不喜欢附加数据,为什么要在问题中做您想做的事情,而不是直接使用列表本身?
        【解决方案4】:

        我不推荐,但你可以使用attach

        > obj <- list(a=1:5, b=2:10, c=-5:5)
        > attach(obj)
        > a
        [1] 1 2 3 4 5
        > b
        [1]  2  3  4  5  6  7  8  9 10
        > c
         [1] -5 -4 -3 -2 -1  0  1  2  3  4  5
        

        【讨论】:

        • 这不是 OP 要求的,它只是将对象 obj 附加到搜索路径。这并不意味着您将列表的元素分配给全局环境中的独立对象。格雷戈里有正确的答案。
        • @JorisMeys 当然,但他们也从未真正说出他们为什么要这样做。 attach 允许您假装他们是全球环境的一部分(至少在简单的情况下),而且工作量很少。话虽如此,我绝对认为格雷戈里的答案是给出的答案中最好的。
        • 我明白你为什么提到它,但是使用attach 带来的问题比它解决的问题多得多,至少当你尝试更改列表中的元素之一时。正如R Style Guide 中所说:使用附加时产生错误的可能性很多。避免它。
        • @JorisMeys 我同意。这就是为什么我不推荐它。不过,我也不太喜欢问题中发布的整个想法。 Gregory 的回答也存在危险
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 2019-07-10
        • 1970-01-01
        • 2023-04-02
        • 2019-11-14
        • 2018-06-15
        相关资源
        最近更新 更多