gpt4 book ai didi

r - 逐字命令参数 : deparse(substitute(foo)) in a wrapper

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

对于那些精通 R 评估器如何处理函数调用的细节的人来说,这是一个小难题。假设我想编写一个函数,该函数采用 R 语句,与我在命令行中编写的内容相同,并同时回显它和计算结果。例子:

 > p.eval(sum(1:3))
sum(1:3) --> 6

这很容易;这是 p.eval()的定义:
p.eval <- function(v,prefix="--> ") { 
cmd <- deparse(substitute(v)); cat(cmd,prefix,v,"\n")
}

但是假设我现在想围绕 p.eval 编写一个包装器,以相同的方式调用;也许作为一个有点疯狂的二元运算符,带有一个虚拟的第二个参数:
%PE% <- function(x,...) p.eval(x)

我想像这样调用它: sum(1:3) %PE% 0应该相当于旧的 p.eval(sum(1:3)) .这当然不起作用,因为 deparse(substitute())p.eval()现在给出 x .

启蒙者的问题:有没有办法让这个工作如我所愿?.. 对于这个特殊的用法,我很好定义 %PE%通过复制/粘贴 p.eval 的单行定义,所以这个问题主要是学术性的。也许我会了解一些关于评估员的本质的东西:)

PS:为什么人们会发现上述功能有用?..假设我开发了一些分析代码并通过 org-babel 以非交互方式调用它(如果你是 Org-mode 和/或 Emacs 用户,这绝对值得玩)。默认情况下,org-babel 在解释器中评估事物时会输出输出。因此,如果我想得到除原始数字以外的任何东西,我必须明确构造要通过 cat 打印的字符串。或 paste ,但是当他们在分析中飞翔时,谁想这样做?.. 上面的 hack 允许您简单地在要打印的行后附加 %PE%0,这将命令回显到组织输出。

最佳答案

尝试这个:

> "%PE%" <- function(x, ...) do.call(p.eval, list(substitute(x)))
> sum(1:3) %PE% 0
sum(1:3) --> 6

关于r - 逐字命令参数 : deparse(substitute(foo)) in a wrapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664458/

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