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

4

我是一名R语言初学者,目前遇到了一个看似简单却涉及到R语言中深刻问题的难题。

我经常使用Rserve,在远程求值时,典型的语法需要重复输入,这让人感到有点繁琐:

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

我希望有一个函数r,只需要一次调用即可完成同样的操作:

r(command)

我第一个、天真、注定失败的尝试包括:

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

你猜对了:这实际上发送了try(command)给我的困惑的Rserve守护程序。我希望command部分评估,如果有意义的话——也就是说,被我输入的参数替换,但不要在本地评估。
我寻找解决方案,在引用、替代、评估、调用等文档中浏览,但我无法找到有效的方法。要么command在本地评估,要么根本不评估。
这不是一个大问题,我可以一直打整个quote(try())的东西;但此时我更好奇如何让它工作!
编辑: 更多关于我想做什么的解释。
  • 在上面的文本中,command是指调用函数的调用,最好是——即不是字符字符串。类似于a <- 3assign("a", 3)而不是"a<-3"quote(a<-3)。 我认为这是使这个问题棘手的一部分。似乎很难告诉R不要在本地评估它,而只是字面发送它。基本上,我想让我的函数有点像quote(),它不评估它的参数。
  • 关于我的意图的一些解释。我希望经常使用Rserve向远程R守护程序传递命令。这些命令将是我自己的(或我的同事的),并且由防火墙和身份验证保护的守护程序(不会以root身份运行)——因此不必担心恶意命令被传递。
  • 老实说,这不是一个大问题,我很乐意始终使用RSeval(c, quote(try()))。此时,我认为这更像是对R的微妙之处的有趣探究 :-)

2
你可能想阅读一下我的尝试,解释如何控制R中的评估以及其中的一些陷阱:https://github.com/hadley/devtools/wiki/Evaluation - hadley
这个链接已经失效了。 - dk.
2个回答

4

您可能希望使用替换命令,它可以使参数未经评估,并且您可以将其构建到调用中。


1
你说得对。我确信在发布问题之前已经尝试过这个,但显然没有!这段代码实现了我想要的功能: r <- function(command) RSeval(c, substitute(command)) 非常感谢。它比我描述的要简单! - crayola

0

我不确定我是否正确理解了你的意思 - eval(parse(text = command)) 是否可以解决问题?请注意,command 是一个字符,因此您可以轻松地将其作为函数参数传递。 如果 我理解得正确的话...

无论如何,评估用户指定的命令可能具有潜在的恶意性,因此不建议这样做。您应该安装AppArmor并进行调整(这不是一件容易的事),或者放弃整个评估过程...


嗨,谢谢回复。不幸的是,我认为我的解释有点不清楚。我将在最初的问题中添加编辑,以使其更少含糊。 - crayola
1
parse(text=command)并不能解决问题,因为这需要command是一个字符字符串。除非我找到一种方法使command成为一个字符字符串而不对其进行评估;但是as.characterdeparse都似乎不适合这个任务。 - crayola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接