這是一箇中綴「+」的形式G.Grothendieck的答案投 - 運營商:
`%+%` <- function(f1, f2) { function(x) {f1(x) +f2(x)} }
f <- cos %+% sin
f
#-----
function(x) {f1(x) +f2(x)}
<environment: 0x7ffccd7eeea8>
#-------
f(0)
#[1] 1
也存在「funprog頁面需要被拉到了功能性成分的例子其中一個函數名稱,例如?Reduce
。也可以被定義爲接受額外的參數:
`%+%` <- function(f1, f2) { function(x,...) {f1(x,...) +f2(x,...)} }
f2 <- dt %+% dt
#-- testing---
> f2(0)
Error in f1(x, ...) : argument "df" is missing, with no default
> f2(0, 6)
[1] 0.7654655
> dt(0,6)
[1] 0.3827328
要看到這是如何內部處理的,你可以通過檢查存儲與所產生的封閉環境恢復的定義:
> ls(envir=environment(f2))
[1] "f1" "f2"
> environment(f2)$f1
function (x, df, ncp, log = FALSE)
{
if (missing(ncp))
.Call(C_dt, x, df, log)
else .Call(C_dnt, x, df, ncp, log)
}
<bytecode: 0x7ffcc63e8ff8>
<environment: namespace:stats>
的問題與你的榜樣你沒有以R功能的方式定義u和v。據推測,這不會是你提出的用例的情況。
> u = function(x,...)2*x
> v = function(x,...) (log(x))
> f <- u %+% v
> f(4)
[1] 9.386294
一些這種編程風格可以通過哈德利的lazyeval
包支持:
> require(lazyeval)
Loading required package: lazyeval
> help(pac=lazyeval)
> lazy_eval(interp(~ u + v, u = sum(1:10), v=sum(1:5)))
[1] 70
> x <- 1:10; y=1:5
> lazy_eval(interp(~ u + v, u = sum(x), v=sum(y)))
[1] 70
> lazy_eval(interp(~ u/v, u = sum(x), v=sum(y)))
[1] 3.666667
> lazy_eval(interp(~ log(u)/v, u = sum(x), v=sum(y)))
[1] 0.2671555
但我遇到了一些困惑,我真的不能明白:
e2 <- ~ exp(u * v)/(1 + x)^2
lazy_eval(interp(e2, u = sum(x)/100, v=sum(y)/100))
#[1] 0.271499668 0.120666519 0.067874917 0.043439947 0.030166630 0.022163238 0.016968729
#[8] 0.013407391 0.010859987 0.008975196
exp(sum(x)/100 +sum(y)/100)/(1+x)^2
[1] 0.50343818 0.22375030 0.12585954 0.08055011 0.05593758 0.04109699 0.03146489 0.02486114
[9] 0.02013753 0.01664258
如果你問「怎麼做這個R中的最佳途徑」,而不是你會得到更少的厭惡你的問題「做了包存在嗎?」 –
可能會看到[** Ryacas **](https://cran.r-project.org/web/packages/Ryacas/index.html)包。例如'庫(Ryacas); u < - 表達式(2 * x); v < - 表達式(log(x)); yacas(表達式(U + V));簡化(yacas(表達式(U * U + V)));的eval(yacas(表達式(U + V))),列表(x = 44)'等 –
(這一句應改爲'的eval(yacas(表達式(U + V)),列表(x = 44) )') –