You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:50:32