R语言dataframe列表取名称失效及lapply输出NULL问题咨询
问题原因拆解
1. 无法获取dataframe名称的原因
- 你创建列表时没有给元素设置名称,直接
list(df1, df2, df3)生成的列表是无命名的,自然无法提取到df1/df2/df3的标识 lapply直接遍历列表元素时,传入函数的是元素的值,deparse(substitute(m))拿到的是lapply内部的迭代临时变量名X[[i]],不是原列表的元素名
2. 末尾打印NULL的原因
R中函数默认返回最后一行运行的结果,你的correction函数没有显式设置返回值:当数据全为正值时if分支不执行,最后一行的if语句返回NULL;即使进入negatives函数,你也没有返回校正后的数据,最终lapply会把所有迭代的返回值(都是NULL)收集为列表默认打印出来,就出现了你看到的末尾NULL输出。
修正方案
步骤1:给列表元素命名
创建列表时直接指定名称:
df1 <- data.frame(c(1,2,3), c(0,1,2), c(0,2,1)) df2 <- data.frame(c(-1,2,3), c(0,1,2), c(0,2,1)) df3 <- data.frame(c(1,2,3), c(0,1,2), c(0,2,1)) # 给列表元素绑定名称 matrices <- list(df1 = df1, df2 = df2, df3 = df3)
步骤2:调整函数和遍历逻辑,避免NULL输出
我们调整函数逻辑,显式返回校正后的dataframe,同时直接用列表名称做打印标识,将lapply的结果赋值给变量就不会默认打印NULL了:
negatives <- function(x){ numNeg <- sum(x<0) smallest <- min(x) cat("\n\nNumber of negative expression values: ", numNeg) cat("\n\nSmallest value: ", smallest) x <- x - smallest cat("\n\nAll expression values positive: ", all(x>=0)) return(x) # 显式返回校正后的数据 } correction <-function(df_name, df_list) { m <- df_list[[df_name]] positives <- all(m>=0) cat("\n\n\n", df_name) # 直接用列表元素名打印 cat("\n\nAll expression values positive: ", positives) if(positives == FALSE) { m <- negatives(m) } return(m) # 显式返回处理后的数据 } # 遍历列表名称,结果赋值给变量就不会打印NULL corrected_matrices <- lapply(names(matrices), correction, df_list = matrices) # 给校正后的列表也绑定原名称方便后续调用 names(corrected_matrices) <- names(matrices)
如果你不需要保留校正后的结果,只是要打印校验信息,可以用invisible包裹lapply,也不会输出NULL:
invisible(lapply(names(matrices), correction, df_list = matrices))
内容的提问来源于stack exchange,提问作者keenan
相关产品推荐
相关产品推荐

