更新以简化功能(删除正则表达式)并添加对字符输入的支持
您可以match.call
在函数内部使用,这样您就可以在不使用引号的情况下调用该函数。
sys <- function(...) {
command <- match.call()[[2L]]
if (!is.character(command)) {
command <- gsub("- ", "-", deparse(command))
}
system(command)
}
现在,以下任何一个都等效于system("ls -a")
sys("ls -a")
sys(ls -a)
上面的sys
函数提取了调用的第二个组成部分,即括号之间的内容。即ls -a
或"ls -a"
在这些示例中。然后将其传递给system
(deparse
如果不是,则首先通过character
)
[我添加了对字符串的支持,因为否则它不适用于正斜杠、点等。例如,sys(ls /home)
不起作用,但sys("ls /home")
确实如此。]
但是,这仍然需要使用括号:-(
为避免使用括号,您可以屏蔽运算符。在这个答案的初始版本中,我展示了如何屏蔽!
这不是一个好主意。您建议?
在评论中使用可以这样做。
`?` <- function(...) {
command <- match.call()[[2L]]
if (!is.character(command)) {
command <- gsub("- ", "-", deparse(command))
}
system(command)
}
现在,这与system("ls -a -l")
?ls -a -l
但是,如果您需要使用正斜杠,则必须使用这样的引号
?"ls /home"
或者,您可以创建一个特殊的二元运算符
"%sys%" <- function(...) {
system(sub("%sys%", "", deparse(match.call())))
}
你可以像这样使用它
ls %sys% -l
ls %sys% .
如果您需要使用正斜杠,您必须引用右侧
ls %sys% "/home"
一个缺点是它需要运算符右侧的一个参数。