Wickham的高级R书中的匿名函数练习

时间:2014-12-19 19:07:09

标签: r

以下是Wickham的高级R书中的一个问题,如果我在三个单独的部分中完成,我可以很容易地解决这个问题,但我想知道是否可以使用功能列表和集成限制列表来完成如果问题有多于三个功能要集成。

(我非常喜欢新手 - 在Coursera / Johns Hopkins R课程中苦苦挣扎,所以如果这是一个愚蠢的问题,我会提前道歉)

问题:使用integrate()和匿名函数查找以下函数的曲线下面积。使用Wolfram Alpha检查您的答案。

  1. y = x ^ 2 - x,[0,10]
  2. 中的x
  3. y = sin(x)+ cos(x),x在[-π,π]
  4. y = exp(x)/ x,[10,20]
  5. 中的x

    以下代码分别用于解决1-3部分:

    ans_1 <- integrate(function(x) x^2 -x, 0, 10  )
    ans_2 <- integrate(function(x) sin(x) + cos(x), -pi, pi   )
    ans_3 <- integrate(function(x) exp(x) / x, 10, 20 )
    

    非常感谢您的任何帮助: - &lt;)

2 个答案:

答案 0 :(得分:2)

肯定有许多优雅的方式,但我无法想到一个。

一种直截了当的方法

f1 <- c(f=function(x) x^2 -x,          l=0,   u=10)
f2 <- c(f=function(x) sin(x) + cos(x), l=-pi, u=pi)
f3 <- c(f=function(x) exp(x) / x,      l=10,  u=20)
funs <- list(f1,f2,f3)
lapply(funs, function(x)integrate(x[['f']], x[['l']], x[['u']]))

#[[1]]
#283.3333 with absolute error < 3.1e-12

#[[2]]
#2.615901e-16 with absolute error < 6.3e-14

#[[3]]
#25613160 with absolute error < 2.8e-07

和@baptiste提出的mapply

functions <- list(function(x) x^2 -x, function(x) sin(x) + cos(x), function(x) exp(x) / x)
lower <- c(0, -pi, 20)
upper <- c(10, pi, 20)
mapply(integrate, functions, lower, upper)

#             [,1]        [,2]         [,3]      
#value        283.3333    2.615901e-16 0         
#abs.error    3.14928e-12 6.304916e-14 0         
#subdivisions 1           1            1         
#message      "OK"        "OK"         "OK"      
#call         Expression  Expression   Expression

答案 1 :(得分:2)

这似乎完全没有意义,但是既然你问过,你可以将集成函数wrt向前导入前三个参数,然后传递一系列函数和限制。

v.int <- Vectorize(integrate,vectorize.args=c("f","lower","upper")) 
fns <- list(function(x) x^2-x, function(x) sin(x)+cos(x), function(x) exp(x)/x)
v.int(fns,lower=c(0,-pi,10),upper=c(10,pi,20))
#              [,1]        [,2]         [,3]        
# value        283.3333    2.615901e-16 25613160    
# abs.error    3.14928e-12 6.304916e-14 2.843632e-07
# subdivisions 1           1            1           
# message      "OK"        "OK"         "OK"        
# call         Expression  Expression   Expression

请注意,Vectorize(...)基本上会在调用integrate(...)时包装函数(在这种情况下为mapply(...)),因此这与@baptiste建议的相同。