R中的Lisp/Scheme-like调用

R中的Lisp/Scheme-like调用,r,parsing,scheme,lisp,expression,R,Parsing,Scheme,Lisp,Expression,出于某些原因,我希望以一种更类似Lisp/Scheme的方式处理R调用(至少就语法而言)(我们都知道R已经过了) 因此,我设置了以下功能: . <- function(f, ...) eval(match.call()[-1], envir=parent.frame()) 因此,我想知道您是否可以提出一些有关定义的想法,以解决上述问题。欢迎使用C/C++代码。正如Brian Diggs在上面评论的那样,您可以使用do.call来执行更快的调用,而不需要eval的开销 >myfn m

出于某些原因,我希望以一种更类似Lisp/Scheme的方式处理R调用(至少就语法而言)(我们都知道R已经过了)

因此,我设置了以下功能:

. <- function(f, ...)
   eval(match.call()[-1], envir=parent.frame())

因此,我想知道您是否可以提出一些有关
定义的想法,以解决上述问题。欢迎使用C/C++代码。

正如Brian Diggs在上面评论的那样,您可以使用
do.call
来执行更快的调用,而不需要
eval
的开销

>myfn myfn(`:`,1,10)
[1]  1  2  3  4  5  6  7  8  9 10
>微基准:微基准(1:10,(`:`,1,10),myfn(`:`,1,10))
单位:纳秒
expr最小lq中值uq最大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)3504413.54751.55287.548227 100

我怀疑,要获得与裸函数调用同等的性能,需要修改R源代码本身。

两个参考资料可以查看它们做相关的事情:
do.call
%>%
来自
magrittr
包。前者类似于
函数(但将后续参数作为列表,而不是单独的参数)。后者在处理调用以完成函数调用方面做了很多工作,并且可能有一些技术可以使环境和效率正确。@BrianDiggs感谢有趣的链接。我看到了一些接近票数的人,所以我把问题缩小到了性能问题上。
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