【问题标题】:R missing arguments in function input not matched by nameR在函数输入中缺少参数与名称不匹配
【发布时间】:2016-10-09 17:12:00
【问题描述】:

我有一个类似的功能

dbh2vol <- function(dbh,hgt,...){

  if (missing(hgt)){
    hgt = 2
    cat("hgt is missing. Set to 2")
  }
  vol  = dbh * hgt
  return(vol)
}

如果我然后用

调用它
Vol = dbh2vol(dbh=10,hgt=4)
#40

一切都很好。如果我有类似的东西

Vol = dbh2vol(dbh=10,param=4)
#hgt is missing. Set to 2[1] 20

正如预期的那样。但如果我这样做了

Vol = dbh2vol(dbh=10,h=4)
#40

h=4 被解释为hgt=4。为什么以及如何避免这种行为,即参数如何与它们的名称完全匹配?

【问题讨论】:

  • 我无法重现这个...为了测试,我只设置了hgt=2*dbh 而不是hgt = some_other_function(dbh) 然后运行Vol = dbh2vol(dbh=10,param=4)。我得到的结果Vol200,如果我设置hgt = 2*dbh 则可以预期。
  • 我试图重现我提供的最小示例。其实有一件很奇怪的事情。通过Vol = dbh2vol(dbh=10,param=4)我也得到了正确的结果。如果我更改为Vol = dbh2vol(dbh=10,h=4),那么h 这实际上是我在我的代码中的内容,它被识别为hgt。你能检查一下这种行为吗?
  • 对我来说它看起来像一个错误。如果我使用hg,则行为相同。看起来如果参数名称至少匹配预期输入的初始部分,则它没有设置为missing

标签: r function arguments missing-data


【解决方案1】:

您观察到的是命名函数参数的部分匹配,据我所知,您无法禁用它。更多信息请参见 r 语言定义https://cran.r-project.org/doc/manuals/R-lang.html#Argument-matching

也许您可以将 hgt 参数放在三个点中并检查一下?当然你会失去位置匹配。

dbh2vol <- function(dbh, ...){
  hgt <- list(...)$hgt
  if (is.null(hgt)) {
    hgt <-  sqrt(dbh)
    cat("hgt has been calculated with some_other_function")
  }
  vol = dbh * hgt
  return(vol)
}

【讨论】:

  • 谢谢。我会尝试你的解决方案,至少我知道这种奇怪行为的原因。
  • 或者在参数列表中将hgt 放在... 之后。
【解决方案2】:

您可以尝试以下方法,而不是将 dbh 和 hgt 作为参数传递:

pars <- list(
    dbh = 10,
    h = 5
)

dbh2vol <- function(pars){
  with(pars,{
    if (!exists("hgt")){
        hgt <- 2
        cat("hgt is missing. Set to 2")
    }
    vol <- dbh * hgt
    return(vol)  
  })
}

dbh2vol(pars)
## hgt is missing. Set to 2[1] 20

这使您也可以轻松地将参数传递给其他函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2013-08-30
    相关资源
    最近更新 更多