dat=list(list(id = "T"), list(id = "T"), 
structure(list(NULL), names = NA_character_), list(id = "T"), 
list(id = "T"), list(id = "T"))

      unlist(dat)

我试过了,但没有奏效

    dat[sapply(dat, is.null)] <- NA

推荐答案

您应该将answerby ThomasIsCoding与上面的列表一起使用,其中顶层没有NULL,并且不想递归地取消列出.

但是,如果这两个条件中的任何一个都不满足,则可以遍历列表,将NULL设置为NA.

tidyverse approach

对于这样的操作,我喜欢使用purrr::modify_tree(),传递一个应用于每个叶的函数.

dat |> 
    purrr::modify_tree(
        leaf = \(x) if(is.null(x)) NA else x,
        post = unlist
    )
#   id   id <NA>   id   id   id 
#  "T"  "T"   NA  "T"  "T"  "T" 

post参数是applied on the way "up", i.e. after the leaves are transformed的函数.

基数R方法

感觉好像您应该能够使用base::rapply()来递归迭代.不幸的是,它是ignores NULL elements.我们可以改为编写一个递归函数:

replace_null  <- function(x, repl = NA, is_node = is.list) {
    if(is_node(x)) return(lapply(x, replace_null))
    if(is.null(x)) repl else x # or in R 4.4:   x %||% repl
}
unlist(replace_null(dat))
#   id   id <NA>   id   id   id 
#  "T"  "T"   NA  "T"  "T"  "T" 

is_node参数确定是否进一步递归,方法与purrr::modify_tree()中同名的参数相同.

The null coalescing operator %||%

顺便说一句,如果您正在使用R的当前开发版本(将作为4.4发布),您可以使用null coalescing operator.

L %||% R New in base是短语if(!is.null(L)) L else Rif(is.null(L)) R else L的一个富有表现力的习语.

以下是当顶层项目之一为NULL时这种方法的差异的示例.

l  <- list(1, NULL)
unlist(l)
# [1] 1

dat |> 
    purrr::modify_tree(
        leaf = \(x) x %||% NA,
        post = unlist
    )
# [1]  1 NA

R相关问答推荐

如何在弹性表中为类别值的背景上色

使用sensemakr和fixest feols模型(R)

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

如何在R中正确对齐放射状图中的文本

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

根据列表中项目的名称多次合并数据框和列表

如何使用shinyChatR包配置聊天机器人

如何自定义3D散点图的图例顺序?

为什么当用osmdata映射R时会得到相邻状态?

您是否可以折叠R中的重复行,同时保留基于所选列的值?

如何用书面利率绘制geom_bar图

将全局环境变量的名称分配给列表中的所有元素

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

在不对R中的变量分组的情况下取两行的平均值

数值型数据与字符混合时如何进行绑定

构建一个6/49彩票模拟系统

R:如何在数据集中使用Apply

如何在刻面和翻转堆叠条形图中对齐geom_text()

按两个条件自动过滤数据

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?