- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个 R 脚本,用于处理特定输入文件夹中的数据。我需要在几个文件夹上运行此脚本,因此我开始编写一个 bash 脚本来循环这些文件夹并运行这些 R 脚本。
我对R一点也不熟悉(该脚本是由以前的工作人员编写的,对我来说基本上是一个黑匣子),而且我对通过脚本传递变量缺乏经验,尤其是涉及多种语言。当我在这里调用 source("$SWS_output/Step_1_Setup.R") 时,还存在一个问题 - R 没有将我的 $SWS_output 读取为变量,而是读取为字符串。
这是我的 bash 脚本:
#!/bin/bash
# Inputs
workspace="`pwd`"
preprocessed="$workspace/6_preprocessed"
# Output
SWS_output="$workspace/7_SKSattempt4_results/"
# create output directory
mkdir -p $SWS_output
# Copy data from preprocessed to SWS_output
cp -a $preprocessed/* $SWS_output
# Loop through folders in the output and run the R code on each folder
for qdir in $SWS_output/*/; do
qdir_name=`basename $qdir`
echo -e 'source("$SWS_output/Step_1_Setup.R") \n source("$SWS_output/(Step_2_data.R") \n q()' | R --no-save
done
我需要将变量“qdir”传递到第二个 R 脚本 (Step_2_data.R) 以告诉它要处理哪个文件夹。
谢谢!
最佳答案
我之前的回答不完整。这是解释命令行解析的更好的努力。
使用 R 的 commandArgs
函数来处理命令行参数非常容易。我写了一个小教程https://gitlab.crmda.ku.edu/crmda/hpcexample/tree/master/Ex51-R-ManySerialJobs 。在集群计算中,这对我们来说非常有效。整个 hpcexample 存储库是开源/免费的。
基本思想是在命令行中您可以使用命令行参数运行 R,如下所示:
R --vanilla -f r-clargs-3.R --args runI=13 parmsC="params.csv" xN=33.45
在本例中,我的 R 程序是一个文件 r-clargs-3.R
,该文件将导入的参数是三个空格分隔的元素 runI
, parmsC
,xN
。您可以根据需要添加任意数量的空格分隔参数。这些名称完全由您自行决定,但要求它们之间用空格分隔,并且等号周围没有空格。字符串变量应该用引号引起来。
我的习惯是用后缀“I”来命名参数,以暗示它是整数,“C”表示字符,“N”表示 float 。
在文件 r-clargs-3.R
中,包含一些代码来读取参数并对它们进行排序。例如,我的教程的示例
cli <- commandArgs(trailingOnly = TRUE)
args <- strsplit(cli, "=", fixed = TRUE)
剩下的工作是对参数进行排序,这是我对参数进行排序的最进化的节(因为它查找后缀“I”、“N”、“C”和“L”(用于逻辑) )),然后将输入强制转换为正确的变量类型(所有输入变量都是字符,除非我们使用 as.integer()
等强制转换):
for (e in args) {
argname <- e[1]
if (! is.na(e[2])) {
argval <- e[2]
## regular expression to delete initial \" and trailing \"
argval <- gsub("(^\\\"|\\\"$)", "", argval)
}
else {
# If arg specified without value, assume it is bool type and TRUE
argval <- TRUE
}
# Infer type from last character of argname, cast val
type <- substring(argname, nchar(argname), nchar(argname))
if (type == "I") {
argval <- as.integer(argval)
}
if (type == "N") {
argval <- as.numeric(argval)
}
if (type == "L") {
argval <- as.logical(argval)
}
assign(argname, argval)
cat("Assigned", argname, "=", argval, "\n")
}
这将在 R session 中创建名为 paramsC
、runI
和 xN
的变量。
这种方法的便利之处在于,相同的基本 R 代码可以使用数百或数千个命令参数变化来运行。适合蒙特卡洛模拟等。
关于r - 如何将 bash 变量传递到 R 脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56777529/
我是一名优秀的程序员,十分优秀!