如何将带参数名的函数参数传递给R中的外部程序?

时间:2014-06-11 18:14:08

标签: python r

例如,

passpara = function(pa, pb, pc) {
    # pa is not passed
    do1(pa)
    # pb and pc are passed
    # passed == "--pb pb_value --pc pc_value"
    # getpass is something I am trying to figure out
    passed = getpass(pb, pc)
    system(paste("cmd", passed))
}

具体而言,请像这样调用passpara

passpara(pa="dummy", pb="full-iso", pc="always")

应该等效于在shell中调用此命令:

cmd --pb full-iso --pc always

在这种情况下,getpass函数会是什么样的?

我也认为system函数有时会很不方便,因为它会收到一个字符串和你 必须手动分隔参数, R中有类似于python的subprocess.call()吗? 在python中,你可以做subprocess.call(["cmd", parameter1, parameter2, parameter3]),和 它将自动分隔args,如果args是字符串,这非常方便 包含空格。

2 个答案:

答案 0 :(得分:2)

请定义不方便,并尝试提供完整且可重现的示例。我们不知道变量papbpc是什么,也不知道do1()getpass()应该做什么。

system()调用,就像pipe()调用一样,允许您根据需要调用带有参数的可执行文件。我想我已使用awksed作为read.csv()之前的过滤器在此处发布了答案。

这是一个简短的例子

R> head(readLines(pipe("cut -f2 -d, CRAN_mirrors.csv")))
[1] "Country"   "0-Cloud"   "Argentina" "Argentina" "Australia" "Australia"
R> 

我们使用单个参数字符串pipe();它使用选项和命令。

编辑:您修改后的问题的答案可能就像一句话一样简单:

R> passpara <- function(pa, pb, pc) sprintf("cmd --pb %s --pc %s", pb, pc)
R> passpara(pa="dummy", pb="full-iso", pc="always")
[1] "cmd --pb full-iso --pc always"
R> 

将此传递给system()是显而易见的。

编辑2:如果参数有空格,请在它们周围放置单个刻度:

R> passpara <- function(pa, pb, pc) sprintf("cmd --pb '%s' --pc '%s'", pb, pc)
R> passpara(pa="dummy", pb="full-iso and then some", pc="always or not")
[1] "cmd --pb 'full-iso and then some' --pc 'always or not'"
R> 

答案 1 :(得分:1)

在回答有关system的投诉时,帮助页面?system提及了{34}中的system2功能;另请参阅:&#34;部分。 system2函数需要将命令作为第一个参数,然后将命令参数的字符向量作为第二个参数。因此,与您为python显示的内容不完全相同,但类似,您可以将其称为:

system2("cmd", c(parameter1, parameter2, parameter3) )