如何让活动绑定知道它是否作为函数调用?

我想要这样的东西:

makeActiveBinding("f", function() {
  called_as_a_function <- ... # <- insert answer here
  if(called_as_a_function) { 
    sqrt
  } else {
    1
  }
}, .GlobalEnv)

# Expected output

f + f
#> 2

f(4) + f
#> 3

f在这里使用,应该适用于任何功能

在上面的例子中f返回1f(4)返回sqrt(4)。在我的实际用例中,naked f(not f()) 将返回一个函数对象,因此 Michal 提出的解决方法不能按原样使用。

+为简单起见,我在这里使用它,但它可能是任何函数或没有函数,包括 NSE 函数,例如quote(),因此,例如quote(f)quote(f())解决方案不应更改它们的输入。

我试图玩,sys.calls()但无法得到任何强大的东西。

也欢迎使用低级代码的答案,谁知道黑魔法可能会有所帮助。

这些不会在顶层调用,所以如果你不能使上述工作但可以让以下工作例如也很好,并且实际上它不会是.GlobalEnv这样,如果你可以让它在另一个环境中工作这也很好。

identity(f + f)
#> 2

identity(f(4) + f)
#> 3

如果你有解决方案,只是让我更接近你可以,如果你的解决方案仅如果发布它们,例如ff()在相同的呼叫不使用它仍然对我很有用。


由于我被问及这里的真实背景,但解决上述问题就是我所要求的。

  • 我的包 {boomer} 提供了一种f通过修改其环境并使用每个函数f调用的垫片填充其新外壳来柯里化函数的方法,我们说我们rig f.
  • 这些 shims 打印调用及其输出,但除了副作用之外的行为相同,因此预计f和 riggedf返回相同
  • 但是,如果返回垫片,或者它们的主体被 操纵f,则输出将出乎意料
  • 通过区别对待shimshim()不同,我避免了更明显的shim()极端情况,会显示副作用,并shim会返回原始函数。

问题在这里,并且正在运行的包显示在这里

而且我通常很好奇是否有可能。

以上是如何让活动绑定知道它是否作为函数调用?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>