【问题标题】:deleting an element from all embedded lists in a list in R从R中列表中的所有嵌入列表中删除一个元素
【发布时间】:2019-10-06 04:04:33
【问题描述】:

我有一个列表 (g),如下所示。要从嵌入列表之一(例如第一个列表)删除元素 k,我可以这样做:g[[1]]$k <- NULL

但是当我尝试从所有嵌入列表中删除元素 k 时,我的 lapply 代码会失败吗?有 Base R 修复吗?

g <- list(b1 = list(data.frame(a = 1:3), k = 4:6), b2 = list(data.frame(a = 8:9), k = 7:9))

lapply(1:length(g), function(i) g[[i]]$k <- NULL) ## FAILS to delete `k` from all embedded lists

【问题讨论】:

    标签: r list function loops lapply


    【解决方案1】:

    R 是一种函数式语言,因此传递参数的副本而不是指向它们的指针。函数不应该对参数的“原件”进行修改。因此,您不应该假设对函数内部访问的值的修改将在该函数的环境之外“可见”除非有一个赋值回原始名称(或替代名称,例如此处完成) :

    > g2 <- lapply(g, function(i){ i$k <- NULL; i})
    > g2
    $b1
    $b1[[1]]
      a
    1 1
    2 2
    3 3
    
    
    $b2
    $b2[[1]]
      a
    1 8
    2 9
    

    另请注意:需要在“k”值被清空后返回修改后的元素。似乎更直接地传递实际元素而不是使用索引。 &lt;-&lt;&lt;- 函数允许“不修改参数”的规则有一个隐含的例外。

    【讨论】:

      【解决方案2】:

      你可以的

      lapply(g, function(x) x[names(x) != "k"])
      #$b1
      #$b1[[1]]
      #  a
      #1 1
      #2 2
      #3 3
      
      
      #$b2
      #$b2[[1]]
      #  a
      #1 8
      #2 9
      

      也可以选择

      lapply(g, function(x) { x[names(x) == "k"] <- NULL; x })
      

      【讨论】:

        【解决方案3】:

        这是discard的选项

        library(purrr)
        map(g, ~ discard(.x, names(.x) == "k"))
        #$b1
        #$b1[[1]]
        #  a
        #1 1
        #2 2
        #3 3
        
        
        #$b2
        #$b2[[1]]
        #  a
        #1 8
        #2 9
        

        【讨论】:

          【解决方案4】:

          类似于@42-:

          lapply(g, '[[<-', 'k', NULL)
          
          # $b1
          # $b1[[1]]
          #   a
          # 1 1
          # 2 2
          # 3 3
          
          # $b2
          # $b2[[1]]
          #   a
          # 1 8
          # 2 9
          

          【讨论】:

            猜你喜欢
            • 2023-03-25
            • 1970-01-01
            • 2011-05-11
            • 2022-07-05
            • 1970-01-01
            • 1970-01-01
            • 2016-01-05
            • 2016-08-16
            相关资源
            最近更新 更多