【问题标题】:Passing additional parameters to pracma::integral2将附加参数传递给 pracma::integral2
【发布时间】:2018-10-06 14:49:03
【问题描述】:

我正在使用pracma::integral2 集成一个有时需要额外参数的功能,但integral2 似乎无法识别我提供的参数。 考虑这两个函数:

fun1 <- function(x, y) exp(-x^2 - y^2)
fun2 <- function(x, y, a) (1 / a) * exp(-x^2 - y^2)

如果我再跑

integral2(fun1,
      xmin = 0,
      xmax = 1,
      ymin = 0,
      ymax = 1)$Q

我按预期得到 0.5577463。但如果我跑:

   integral2(fun2,
          xmin = 0,
          xmax = 1,
          ymin = 0,
          ymax = 1,
          a = 1)$Q

我明白了:

Error in fun(x, y, ...) : argument "a" is missing, with no default 

引用显示如下:

  1. fun(x, y, ...)
  2. FUN(X, Y)
  3. .tensor(xmin, xmax, thetaL, thetaR, phiB, phiT, FUN, phiBvar, phiTvar,矢量化 = 矢量化,奇异 = 奇异)
  4. integral2(fun2, xmin = 0, xmax = 1, ymin = 0, ymax = 1, a = 1)

我不知道.tensor是什么,但是看起来它的产品FUN(X,Y)已经失去了...。

这里出了什么问题?

【问题讨论】:

    标签: r parameter-passing integral


    【解决方案1】:

    a 与integral2 的abstol 参数相匹配。只需将 a 重命名为 fun2 中的其他名称,如下面的解决方案 1 中所示,或者明确指定 abstol,这样它就不会像下面的解决方案 2 中那样混淆。

    library(pracma)
    
    # solution 1
    fun2aa <- function(x, y, aa) (1 / aa) * exp(-x^2 - y^2)
    integral2(fun2aa,
              xmin = 0,
              xmax = 1,
              ymin = 0,
              ymax = 1,
              aa = 1)$Q
    ## [1] 0.5577463
    
    # solution 2
    fun2 <- function(x, y, a) (1 / a) * exp(-x^2 - y^2) # same as in question
    integral2(fun2,
              xmin = 0,
              xmax = 1,
              ymin = 0,
              ymax = 1,
              abstol = 0, # added
              a = 1)$Q
    ## [1] 0.5577463
    

    请注意,如果integral2 在abstolabstol 之前放置了点.这里integral2a 与integral2 相同,只是点点点放在ymax 之后。

    # solution 3
    
    fun2 <- function(x, y, a) (1 / a) * exp(-x^2 - y^2) # same as in question
    
    integral2a <- function (fun, xmin, xmax, ymin, ymax, ..., 
      sector = FALSE, reltol = 1e-06, abstol = 0, maxlist = 5000, 
      singular = FALSE, vectorized = TRUE) {}
    body(integral2a) <- body(integral2)
    environment(integral2a) <- environment(integral2)
    
    integral2a(fun2,
              xmin = 0,
              xmax = 1,
              ymin = 0,
              ymax = 1,
              a = 1)$Q
    ## [1] 0.5577463
    

    【讨论】:

    • 这里没有给任何在 R 包中编写函数的人的消息吗?大多数用户不想检查一长串默认变量,以便他们自己的 ... 变量不与该列表共享首字母。它破坏了默认值的整个想法。
    • 是的,消息是在编写包时将这些参数放在之后点、点、点而不是之前。
    猜你喜欢
    • 2011-12-21
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2011-07-10
    • 2015-12-30
    • 2015-03-03
    相关资源
    最近更新 更多