我可以强制Rscript在命令行参数中传递通配符吗?

我可以强制Rscript在命令行参数中传递通配符吗?,r,shell,command-line-arguments,glob,R,Shell,Command Line Arguments,Glob,尽我所能(因为我没有找到太多关于它的文档),当使用包含通配符*的命令参数运行Rscript时,该参数将扩展为匹配的文件路径的字符向量,或者在没有匹配的情况下传递。有没有一种方法可以一直传递通配符,这样我就可以自己在脚本中处理它(例如使用Sys.glob 下面是一个最小的示例,从终端运行: ls ## foo.csv bar.csv baz.txt Rscript -e "print(commandArgs(T))" *.csv ## [1] "foo.csv" "bar.csv" Rscript

尽我所能(因为我没有找到太多关于它的文档),当使用包含通配符
*
的命令参数运行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之前已展开,因此我无法检查是否提供了第二个参数。

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

  • 在引用文本中传递表达式,并在R中处理它,方法是在另一个命令中计算该表达式或以其他方式进行处理

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

    Rscript -e "list.files(pattern = paste0('*\\\\.', commandArgs(T)))" "csv$"
    
  • 通过复杂和不必要的方式,禁用该命令的全局绑定:


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

    我假设您处于*nix状态,因为Windows cmd不进行扩展。请参阅以下示例。。。plz@42-谢谢!添加了一个示例。@HongOoi有用链接。有没有办法解决R中的这种行为——以某种方式将这些参数压缩回单个字符串?一般来说,我不想关闭Rscript命令的globbing,只是这一个程序——而且我不确定我是否有适当的权限来处理我正在使用的计算机上的配置文件。