【发布时间】:2011-11-04 10:32:48
【问题描述】:
我正在使用 bash 脚本编写和运行 R 脚本:因为我不精通 RI,所以我曾经在 bash 脚本中编写循环和条件,然后在 R 脚本或“这里的文档”中进行翻译......就像你可以想象以这种方式生成的 R_scripts 变得非常长且难以阅读......所以我学习了如何用 R 编写循环和条件,但我发现命令 system() 有几个困难,所以我意识到 shell 脚本是如果我不想因为引用和转义而发疯的话,某种程度上是必要的...... ;-)
我遇到的第一个问题是:
我想声明一个像这样的变量Rarr="file_1", "file_2", "file_3"ecc
因为我想把它插入到R_script中
cat>my_R_script.R<<EOF
my_arr<-c(${Rarr})
do something with my_arr
EOF
需要引号,因为如果没有引用 file_names,R 会提示您找不到名为 file_names 的对象
我尝试遵循comma separated elements of array 中的第一个解决方案
定义IFS="" ,""
但似乎当 Rarr="${arr[*]}";echo "${Rarr}" 的元素仅由 ${IFS} 的第一个字符分隔时...在我的情况下,它们将由 " 分隔有没有办法避免这种情况?
所以基本上我的问题是:如何强制 shell 考虑 ${IFS} 中的所有字符?
无论如何,我找到了两个解决我的问题的方法.. 第一个
arr=($(ls -1 | tail))
new_IFS="\" ,\""
Rarr=${arr[0]}
for ((i=1;i<${#arr[@]};i++))
do
Rarr="${Rarr}${new_IFS}${arr[$i]}"
#echo "${Rarr}"
done;
Rarr=\""${Rarr}"\"
#echo ${Rarr}
还有一个参数替换...但我想知道是否存在直接解决我的问题的方法
提前感谢您的帮助
【问题讨论】:
-
您能否简化您的描述并提供一个示例。我觉得很难解决你的问题。
-
你为什么要通过 bash 做这些(编写脚本和执行脚本)?为什么您认为有必要动态更改 R 脚本的内容?这确实不是使用 any 可脚本化工具的方式,无论是 R、MatLab、numpy 等。
-
嗨,Carl,我想采用这种方式,因为我必须对许多不同的系统进行相同的分析。所以我使用 bash 生成 R 脚本,然后,一旦 bash 脚本生成了脚本,我就使用
R CMD BATCH name_of_R_script运行它 -
嗨 Mu 基本上我在问为什么发布 here 的解决方案在我的情况下不起作用:有没有办法强制 IFS 超过一个字符?
-
在这种情况下,为什么不编写一个调用 vi 或 emacs 进行编辑的 bash 脚本呢?