gpt4 book ai didi

r - R中system()的运算符

转载 作者:行者123 更新时间:2023-12-04 18:14:24 25 4
gpt4 key购买 nike

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

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

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

    最佳答案

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

    您可以使用 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"

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

    关于r - R中system()的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11989083/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com