Bash批量传递文件名给R程序,如何实现R端接收?
解决R脚本批量处理文件时接收输入的问题
你的核心问题是:Bash脚本用重定向(<)传递文件内容给R,但commandArgs()只能获取命令行参数,无法读取标准输入流的内容。下面提供两种可行解决方案:
方案1:将文件名作为命令行参数传递(推荐)
修改Bash脚本,把文件名直接作为参数传给R脚本,这样R就能通过commandArgs()拿到文件名并读取。
修正后的Bash脚本
注意原脚本中j的循环括号存在语法错误(需把)改为}),同时调整传参方式:
#!/bin/bash for i in {0..100} do for j in {1..100} do # 将文件名作为命令行参数传给R脚本 Rscript program.R file-type$i-sector$j.tsv done done
对应的R脚本代码
用commandArgs(trailingOnly = TRUE)获取传入的文件名,再执行读取操作:
# 获取命令行传入的第一个参数(即目标文件名) input_file <- commandArgs(trailingOnly = TRUE)[1] # 读取文件,保留你原有的参数设置 data <- read.table(file = input_file, sep = '\t', header = TRUE, fill = TRUE) # 在这里添加你的文件处理逻辑
方案2:直接读取标准输入(无需修改Bash脚本)
如果不想改动Bash的重定向逻辑,可让R直接读取标准输入流的内容,指定file = "stdin"即可:
R脚本代码
# 直接读取Bash重定向过来的标准输入内容 data <- read.table(file = "stdin", sep = '\t', header = TRUE, fill = TRUE) # 在这里添加你的文件处理逻辑
说明
此方式下,Bash的< file-typeX-sectorY.tsv操作会把文件内容直接传入R的标准输入流,R通过stdin就能完整读取文件内容,无需依赖commandArgs()。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

