在命令行中将参数传递给 R 脚本 (shell/bash):当列名包含波浪号 (~) 时该怎么办
Passing arguments to R script in command line (shell/bash): what to do when column names contain tilde (~)
我正在通过 bash 使用 Rscript
到 运行 R 脚本,并且我想指定要传递给脚本本身内的函数的参数。具体来说,我想传递指定的参数:
- 数据文件路径 (
.csv
) 和
- 该数据文件中的某些列名称。
当列名包含波浪号 (~
) 时,我 运行 遇到了问题。我试过用反引号包裹列名,但仍然不成功。
例子
我想编写一个脚本,接收 .csv
格式的数据文件,并根据用户的选择绘制一个变量的直方图。
这是我的函数:
plot_histogram <- function(path_to_input, x_var) {
data_raw <- read.csv(file = path_to_input)
path_to_output_folder <- dirname(path_to_input)
png(filename = paste0(path_to_output_folder, "/", "output_plot.png"))
hist(as.numeric(na.omit(data_raw[[x_var]])), main = "histogram", xlab = "my_var")
replicate(dev.off(), n = 20)
}
让我们 运行 它在一些假数据上
set.seed(123)
df <- data.frame(age = sample(20:80, size = 100, replace = TRUE))
write.csv(df, "some_age_data.csv")
plot_histogram(path_to_input = "some_age_data.csv",
x_var = "age")
如预期的那样,我得到一个带有绘图的 .png
文件,保存到 .csv
所在的同一目录
现在从命令行
将 R 脚本自定义为 运行
plot_histogram.R
args <- commandArgs(trailingOnly = TRUE)
## same function as above
plot_histogram <- function(path_to_input, x_var) {
data_raw <- read.csv(file = path_to_input)
path_to_output_folder <- dirname(path_to_input)
png(filename = paste0(path_to_output_folder, "/", "output_plot.png"))
hist(as.numeric(na.omit(data_raw[[x_var]])), main = "histogram", xlab = "my_var")
replicate(dev.off(), n = 20)
}
plot_histogram(path_to_input = args[1], x_var = args[2])
然后 运行 通过命令行使用 Rscript
$ Rscript --vanilla plot_histogram.R /../../../some_age_data.csv "age"
也可以!
但是,如果列名包含波浪号
,事情就会中断
第 1 步:创建假数据
library(tibble)
set.seed(123)
df <- tibble(`age-blah~value` = sample(20:80, size = 100, replace = T))
write.csv(df, "some_age_data.csv")
第 2 步:使用 Rscript
:
$ Rscript --vanilla plot_histogram.R /../../../some_age_data.csv "age-blah~value"
Error in hist.default(as.numeric(na.omit(data_raw[[x_var]])), main =
"histogram", : invalid number of 'breaks' Calls: plot_histogram -> hist -> hist.default Execution halted
底线
使用 Rscript
时,如何传递指定包含波浪号的列名的参数?或者,在 Rscript
?
的框架内,我如何解决 .csv
列名称中具有波浪号格式的文件
谢谢!
您 成功传递了指定包含波浪号的列名的参数。但是,read.csv
已经“修复”了列名,因此它实际上不包含波浪号。
read.csv
正在默默地将列名转换为 age.blah.value
。使用 check.names = FALSE
使其成为 age-blah~value
.
data_raw <- read.csv(file = path_to_input, check.names = FALSE)
我正在通过 bash 使用 Rscript
到 运行 R 脚本,并且我想指定要传递给脚本本身内的函数的参数。具体来说,我想传递指定的参数:
- 数据文件路径 (
.csv
) 和 - 该数据文件中的某些列名称。
当列名包含波浪号 (~
) 时,我 运行 遇到了问题。我试过用反引号包裹列名,但仍然不成功。
例子
我想编写一个脚本,接收 .csv
格式的数据文件,并根据用户的选择绘制一个变量的直方图。
这是我的函数:
plot_histogram <- function(path_to_input, x_var) {
data_raw <- read.csv(file = path_to_input)
path_to_output_folder <- dirname(path_to_input)
png(filename = paste0(path_to_output_folder, "/", "output_plot.png"))
hist(as.numeric(na.omit(data_raw[[x_var]])), main = "histogram", xlab = "my_var")
replicate(dev.off(), n = 20)
}
让我们 运行 它在一些假数据上
set.seed(123)
df <- data.frame(age = sample(20:80, size = 100, replace = TRUE))
write.csv(df, "some_age_data.csv")
plot_histogram(path_to_input = "some_age_data.csv",
x_var = "age")
如预期的那样,我得到一个带有绘图的 .png
文件,保存到 .csv
所在的同一目录
现在从命令行
将 R 脚本自定义为 运行plot_histogram.R
args <- commandArgs(trailingOnly = TRUE)
## same function as above
plot_histogram <- function(path_to_input, x_var) {
data_raw <- read.csv(file = path_to_input)
path_to_output_folder <- dirname(path_to_input)
png(filename = paste0(path_to_output_folder, "/", "output_plot.png"))
hist(as.numeric(na.omit(data_raw[[x_var]])), main = "histogram", xlab = "my_var")
replicate(dev.off(), n = 20)
}
plot_histogram(path_to_input = args[1], x_var = args[2])
然后 运行 通过命令行使用 Rscript
$ Rscript --vanilla plot_histogram.R /../../../some_age_data.csv "age"
也可以!
但是,如果列名包含波浪号
,事情就会中断第 1 步:创建假数据
library(tibble)
set.seed(123)
df <- tibble(`age-blah~value` = sample(20:80, size = 100, replace = T))
write.csv(df, "some_age_data.csv")
第 2 步:使用 Rscript
:
$ Rscript --vanilla plot_histogram.R /../../../some_age_data.csv "age-blah~value"
Error in hist.default(as.numeric(na.omit(data_raw[[x_var]])), main = "histogram", : invalid number of 'breaks' Calls: plot_histogram -> hist -> hist.default Execution halted
底线
使用 Rscript
时,如何传递指定包含波浪号的列名的参数?或者,在 Rscript
?
.csv
列名称中具有波浪号格式的文件
谢谢!
您 成功传递了指定包含波浪号的列名的参数。但是,read.csv
已经“修复”了列名,因此它实际上不包含波浪号。
read.csv
正在默默地将列名转换为 age.blah.value
。使用 check.names = FALSE
使其成为 age-blah~value
.
data_raw <- read.csv(file = path_to_input, check.names = FALSE)