我试图通过命令行传递多个文件路径参数到Rscript,然后可以使用参数解析器进行处理。最终我会想要这样的东西
Rscript test.R --inputfiles fileA.txt fileB.txt fileC.txt --printvar yes --size 10 --anotheroption helloworld -- etc...
通过命令行传递,并在解析时将结果作为R中的数组
args$inputfiles = "fileA.txt", "fileB.txt", "fileC.txt"
我试过几个解析器,包括optparse和getopt,但它们似乎都不支持这个功能。我知道argparse可以,但它目前不适用于R版本2.15.2
有什么想法吗?
谢谢
7条答案
按热度按时间deyfvvtc1#
您描述命令行选项的方式与大多数人期望使用它们的方式不同。通常,命令行选项将接受单个参数,没有前选项的参数将作为参数传递。如果一个参数需要多个元素(比如一个文件列表),我建议使用strsplit()解析字符串。
下面是一个使用optparse的例子:
以下是几个运行示例:
请注意,对于strsplit,您可以使用正则表达式来确定其值。我会建议类似以下的东西,这将允许您使用逗号或冒号来分隔您的列表:
wkyowqbh2#
虽然当这个问题被问到的时候它还没有在CRAN上发布,但是现在已经有了一个可以做到这一点的argparse模块的beta版本。它基本上是一个同名的流行python模块的 Package 器,所以你需要安装最新版本的python才能使用它。请参阅安装说明了解更多信息。基本示例包括对任意长的数字列表求和,这些数字应该不难修改,因此您可以获取任意长的输入文件列表。
qzlgjiam3#
在脚本test.R的前面,你可以这样写:
获得:
e0bqpujr4#
在四处搜索并避免自下而上编写一个新包之后,我发现使用包optparse输入多个参数的最佳方法是用一个字符分隔输入文件,该字符最有可能非法包含在文件名中(例如,冒号)
文件名中也可以有空格,只要空格被转义(optparse会处理这个问题)
最好有一个包(可能是optparse的修改版本),它将支持多个参数,如问题和下面提到的
人们可能会认为这些微不足道的特性会被实现到一个广泛使用的包中,比如optparse
欢呼
igetnqfo5#
如果输入参数是相同长度的列表,@agstudy的解决方案无法正常工作。默认情况下,sapply会将相同长度的输入折叠成一个矩阵,而不是一个列表。修复方法很简单,只需在sapply解析参数时显式地将simplify设置为false。
nukf8bse6#
我也遇到了同样的问题,我开发的解决方法是在输入命令行参数被馈送到
optparse
解析器之前调整它们,方法是使用一个替代的字符串(如“管道”字符)将空格分隔的输入文件名连接在一起,该字符串不太可能用作文件名的一部分。然后在最后再次反转调整,使用
str_split()
删除中间值。下面是一些示例代码:
假设上面的文件名为
fix_optparse.R
,下面是输出结果:这种方法的一个小限制是,如果任何其他参数有可能接受一个“管道”字符作为有效输入,那么这些参数将不会被正确处理。但是,我认为您可能也可以开发一个稍微复杂一些的解决方案来正确处理这种情况。这个简单的版本大部分时间都有效,并说明了总体思路。
ss2ws0br7#
只是遇到了这个问题,幸运的是,{argparser}包支持多值参数。
add_argument()
函数中有nargs
参数,将其指定为Inf
将有效。例如:
创建于2023-10-10使用reprex v2.0.2