如何用map和list.dirs生成指定嵌套列表?R版本差异疑问
R控制台输出格式调整与版本差异问题
问题描述
首先创建目标目录结构:
dir.create("A") dir.create("B") setwd("A") dir.create("C") dir.create("D") setwd("..") setwd("B") dir.create("E") dir.create("F") setwd("..")
运行以下代码:
list.dirs(recursive = F) %>% map(~list.dirs(path = ., recursive = F))
得到的输出为:
[[1]] [1] "./A/C" "./A/D" [[2]] [1] "./B/E" "./B/F"
期望的输出格式为每个子目录路径单独占一行:
[[1]] [1] "./A/C" [2] "./A/D" [[2]] [1] "./B/E" [2] "./B/F"
同时存在疑问:该代码在旧电脑可输出期望格式,新电脑却出现差异,是否因R版本更新导致需要调整处理方式?
解决方案
1. 调整输出显示格式
你看到的差异本质是R控制台的输出换行设置不同,而非返回的对象结构有差异。有两种方式可以实现期望的输出格式:
- 方式一:修改控制台输出宽度
通过调整options()中的width参数,缩小输出宽度阈值,让每个路径单独换行:
# 设置控制台输出宽度为较小值,强制短向量分行 options(width = 10) list.dirs(recursive = F) %>% map(~list.dirs(path = ., recursive = F))
- 方式二:转换为单元素列表结构
如果需要不受控制台宽度影响,可将每个子目录路径转换为单元素列表,输出时自然每个占一行:
list.dirs(recursive = F) %>% map(~list.dirs(path = ., recursive = F) %>% as.list())
此方式返回的结构输出示例:
[[1]] [[1]][[1]] [1] "./A/C" [[1]][[2]] [1] "./A/D" [[2]] [[2]][[1]] [1] "./B/E" [[2]][[2]] [1] "./B/F"
2. 版本差异的原因
R的控制台输出逻辑在不同版本(尤其是4.0及以上版本)有细微调整,核心是自动换行的阈值计算规则变化。旧电脑的R版本可能默认width值更小,或者换行规则更宽松,导致短向量也会分行显示;新电脑的R版本默认width更大,因此两个短路径字符串会被合并到同一行输出。
你可以通过getOption("width")命令查看当前控制台的宽度设置,新旧电脑的该参数值大概率存在差异。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

