【问题标题】:Can I force Rscript to pass wildcard in command line arguments?我可以强制 Rscript 在命令行参数中传递通配符吗?
【发布时间】:2017-03-15 06:03:13
【问题描述】:

尽我所能(因为我没有太多运气找到它的文档)当使用包含通配符 * 的命令参数运行 Rscript 时,该参数被扩展为匹配的文件路径,或者如果没有匹配则通过。有没有办法一直传递通配符,所以我可以在脚本中自己处理它(例如使用Sys.glob 之类的东西)?

这是一个最小的例子,从终端运行:

ls
## foo.csv bar.csv baz.txt
Rscript -e "print(commandArgs(T))" *.csv
## [1] "foo.csv" "bar.csv"
Rscript -e "print(commandArgs(T))" *.txt
## [1] "baz.txt"
Rscript -e "print(commandArgs(T))" *.rds
## [1] "*.rds"

编辑:我了解到这种行为来自 bash,而不是 Rscript。是否有某种方法可以在 R 中解决这种行为,或者抑制特定 R 脚本而不是 Rscript 命令的通配符扩展?在我的特殊情况下,我想运行一个带有两个参数 Rscript collapse.R *.rds out.rds 的函数,它将许多单个 RDS 文件的内容连接到一个列表中,并将结果保存在 out.rds 中。但由于通配符在传递给 R 之前已扩展,因此我无法检查是否提供了第二个参数。

【问题讨论】:

  • 我假设您使用的是 *nix,因为 Windows cmd 不进行扩展。见stackoverflow.com/questions/11456403/…
  • 贴一些例子...请。
  • @42- 谢谢!添加了一个示例。
  • @HongOoi 有用的链接。有没有办法解决 R 中的这种行为 - 以某种方式将这些参数折叠回单个字符串?一般来说,我不想关闭 Rscript 命令的 globbing,只是这个程序 - 我不确定我是否有适当的权限来处理我正在处理的计算机上的配置文件。跨度>

标签: r shell command-line-arguments glob


【解决方案1】:

如果我理解正确,您不希望 bash 为您提供通配符,您希望传递表达式本身,例如*.csv。一些选项包括:

  1. 在引用的文本中传递表达式并在 R 中处理它,或者通过在另一个命令中评估它,或者以其他方式

    Rscript -e "list.files(pattern = commandArgs(T))" "*\.csv$"
    
  2. 仅传递扩展名并在 R 中按上下文处理 *

    Rscript -e "list.files(pattern = paste0('*\\\\.', commandArgs(T)))" "csv$"
    
  3. 通过复杂且不必要的方法,禁用该命令的通配:Stop shell wildcard character expansion?

注意:我已将参数更改为正则表达式,以防止它过于贪婪地匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2014-09-22
    • 2016-06-18
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多