像R中的调用
出于某些原因,我想以更类似Lisp / Scheme的方式(至少就语法而言)使用R调用(我们都知道R受到Scheme的强烈启发)。
因此,我设置了以下功能:
. <- function(f, ...)
eval(match.call()[-1], envir=parent.frame())
这允许我表达例如以下R代码:
x <- sort(sample(1:10, 5, replace=TRUE))
for (i in x) {
print(1:i)
}
在下面的语义等同形式中:
.(`<-`, x,
.(sort,
.(sample,
.(`:`, 1, 5),
5, replace=TRUE)))
.(`for`, i, x,
.(`{`,
.(print,
.(`:`, 1, i))))
我对目前的定义非常满意.
(因为它只是为了好玩)。 但它肯定远非完美。 特别是它的表现当然很差:
microbenchmark::microbenchmark(1:10, .(`:`, 1, 10))
## Unit: nanoseconds
## expr min lq median uq max neval
## 1:10 189 212.0 271.5 349 943 100
## .(`:`, 1, 10) 8809 10134.5 10763.0 11467 44066 100
所以我想知道你能否提出一些关于定义的想法.
这将解决上述问题。 C / C ++代码是受欢迎的。
正如Brian Diggs在上面评论的那样,您可以使用do.call
在没有eval
开销的情况下执行更快的调用。
> myfn <- function(f, ...)
+ do.call(f, list(...), envir=parent.frame())
> myfn(`:`, 1, 10)
[1] 1 2 3 4 5 6 7 8 9 10
> microbenchmark::microbenchmark(1:10, .(`:`, 1, 10), myfn(`:`, 1, 10))
Unit: nanoseconds
expr min lq median uq max neval
1:10 177 286.0 346.5 404.0 887 100
.(`:`, 1, 10) 9794 11454.0 12141.5 12808.5 48391 100
myfn(`:`, 1, 10) 3504 4413.5 4751.5 5287.5 48227 100
我怀疑获得与裸函数调用等效的性能将需要修改R源本身。
链接地址: http://www.djcxy.com/p/79873.html上一篇: like calls in R