2

我想让 R 更容易执行系统命令。像 ipython 与 python 之类的东西。以下是一些想法:

  • 定义 cd 函数以通过包装 getwd 和 setwd 来更改工作目录
  • 定义一个运算符来包装 system() 命令,以便我可以运行类似 "$ls" 的东西来替换 system("ls")

第一个很容易实现。但是,我坚持使用第二个。我发现没有办法在 R 中为字符串重新定义运算符。然后我退后一步,我尝试定义一个 sys(param)。但是现在,我仍然需要输入引号。例如,我需要运行 sys("ls") 而不是 sys(ls) 来列出目录。有没有办法让参数假设它是一个字符串,即使没有引号?谢谢。欢迎任何建议。

4

1 回答 1

4

更新以简化功能(删除正则表达式)并添加对字符输入的支持

您可以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"在这些示例中。然后将其传递给systemdeparse如果不是,则首先通过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"

一个缺点是它需要运算符右侧的一个参数。

于 2012-08-16T17:18:57.967 回答