将未评估的命令传递给R中的函数

时间:2011-02-05 10:57:52

标签: r eval

我是一个R新手,我对这个看似简单的问题感到困惑,但却触及了关于如何以及何时在R中评估事物的深刻问题。

我正在使用Rserve;远程评估事物的典型语法是重复输入有点痛苦:

RSeval(connection, quote(try(command)))

所以我想要一个函数r,只需要调用它就可以做同样的事情:

r(command)

我的第一个,天真的,必然会失败的尝试:

r <- function(command) {
    RSeval(c, quote(try(command)))
}

你已经猜到了:这实际上是try(command)发送给我困惑的Rserve守护进程。我希望command 部分评估,如果这有意义 - 即由我输入的参数替换,但不用在本地评估它。< / p>

我寻找解决方案,浏览文档中的引用,替换,评估,调用等等。但我无法找到有用的东西。 command要么在本地评估,要么根本不评估。

这不是一个大问题,我可以随时输入整个quote(try())这个东西;但在这一点上,我对如何让它发挥作用非常好奇!

编辑: 关于我想做什么的更多解释。

  • 在上面的文本中,command意味着调用函数,理想情况下 - 即不是字符串。像a <- 3assign("a", 3)而不是"a<-3"quote(a<-3)。 我相信这是使这个棘手的部分原因。似乎很难告诉R不要在本地评估这个,但只是按字面意思发送它。基本上我希望我的函数有点像quote(),它不会评估它的参数。
  • 关于我的意图的一些解释。我希望经常使用Rserve将命令传递给远程R守护程序。这些命令将是我自己(或我的同事)和防火墙和身份验证保护的守护程序(并且不会以root身份运行) - 因此不必担心会传递恶意命令。
  • 说实话,这不是一个大问题,我很乐意一直使用RSeval(c, quote(try()))。在这一点上,我认为这更像是对R的太多的有趣探究: - )

2 个答案:

答案 0 :(得分:4)

您可能想要使用substitute命令,它可以为您提供可以构建到调用中的未评估的参数。

答案 1 :(得分:0)

我不确定我是否理解正确 - eval(parse(text = command))会不会这样做?请注意command是一个字符,因此您可以轻松地将其作为函数参数传递。 如果我明白了......

无论如何,评估用户指定的命令可能是恶意的,因此不推荐使用。你应该安装AppArmor并调整它(这不是一个简单的),或放弃整个评估的东西......