如何让R脚本支持命令行调用以生成指定图表与文件?
问题
我在Linux命令行调用R脚本生成图表和CSV文件,现有脚本testing.R代码如下:
input <- mtcars[,c('mpg','cyl')] write.table(input, "mtcars.csv") pdf("boxplot.pdf") boxplot(mpg ~ cyl, data = mtcars, xlab = "Number of Cylinders", ylab = "Miles Per Gallon", main = "Mileage Data") dev.off()
执行命令Rscript testing.R mtcars.csv boxplot.pdf后,只输出:
null device 1
想问两个问题:
- 图表和CSV文件是否已经生成?
- 怎么修改脚本,让它能从命令行接收指定的输出文件名?
解答
1. 文件已生成
null device 1是dev.off()的正常输出,代表PDF绘图设备已成功关闭,说明文件已经生成。但你当前的脚本硬编码了输出文件名,所以不管命令行传了什么参数,都会生成mtcars.csv和boxplot.pdf,命令行传入的参数并没有被脚本读取。你可以在当前目录执行ls命令查看这两个文件是否存在。
2. 修改脚本支持命令行参数
使用R的commandArgs()函数可以获取命令行传入的参数,修改后的脚本如下:
# 只获取命令行中脚本名之后的参数 args <- commandArgs(trailingOnly = TRUE) # 检查参数数量是否正确 if (length(args) != 2) { stop("用法:Rscript testing.R <CSV输出路径> <PDF输出路径>") } # 赋值输出路径 csv_path <- args[1] pdf_path <- args[2] # 处理数据 input <- mtcars[,c('mpg','cyl')] # 写入CSV(建议添加row.names=FALSE避免输出行号,sep=","让文件标准CSV格式) write.table(input, csv_path, row.names = FALSE, sep = ",") # 生成PDF图表 pdf(pdf_path) boxplot(mpg ~ cyl, data = mtcars, xlab = "Number of Cylinders", ylab = "Miles Per Gallon", main = "Mileage Data") dev.off()
执行修改后的脚本
在命令行运行:
Rscript testing.R my_custom_data.csv my_custom_plot.pdf
执行完成后,你指定的两个文件会生成在当前目录(如果指定了绝对路径则生成到对应位置),null device 1的提示依然会出现,这是正常现象,不影响文件生成。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

