7
由於某些原因,我希望以更類似Lisp/Scheme的方式使用R調用(至少就語法而言)(我們都知道R有已被heavily inspired by Scheme)。類似於Lisp/Scheme的調用R
因此,我設置了以下功能:
. <- 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++代碼是受歡迎的。
兩個資源可以查看相關內容:'magrittr'包中的'do.call'和'%>%'。前者與'.'函數類似(但將後續參數作爲列表,而不是單獨的參數)。後者通過操縱調用來完成全部的函數調用,並且可能有一些獲取環境和提高效率的技巧。 –
@BrianDiggs感謝有趣的鏈接。我已經看到了一些接近的選票,所以我將我的問題僅限於性能問題。 – gagolews