【问题标题】:IFS more than a character usage with R script and bashIFS 不仅仅是 R 脚本和 bash 的字符用法
【发布时间】: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 脚本呢?

标签: bash r scripting ifs


【解决方案1】:

使用标准 IFS 将 Rarr 简单定义为 Rarr="\"file_1\" \"file_2\" \"file_3\"" 怎么样?

【讨论】:

  • 这是不可能的,因为我不想输入数组的成员,这些都是命令的结果
【解决方案2】:

如果我们没有空格(我们不需要):

#!/bin/bash
arr=(${arr[*]/#/\"})            # prepend quotes
arr=(${arr[*]/%/\"})            # append quotes
IFS=, eval 'Rarr="${arr[*]}"'   # join by commas

(注意:arr 已修改)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多