首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R函数输入中缺少的参数不按名称匹配

R函数输入中缺少的参数不按名称匹配
EN

Stack Overflow用户
提问于 2016-10-09 17:12:00
回答 2查看 158关注 0票数 0

我有个功能就像

代码语言:javascript
复制
dbh2vol <- function(dbh,hgt,...){

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

如果我把它叫做

代码语言:javascript
复制
Vol = dbh2vol(dbh=10,hgt=4)
#40

百事大吉。如果我有这样的东西

代码语言:javascript
复制
Vol = dbh2vol(dbh=10,param=4)
#hgt is missing. Set to 2[1] 20

如预期的那样。但如果那样的话

代码语言:javascript
复制
Vol = dbh2vol(dbh=10,h=4)
#40

h=4被解释为hgt=4。为什么和怎样才能避免这样的行为,即如何才能使论点与它们的名字完全匹配呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-09 17:53:09

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

也许你可以把hgt的论点放在这三个点上,然后检查一下吗?当然,你会松开位置匹配。

代码语言:javascript
复制
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)
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-09 17:53:50

不必将dbh和hgt作为参数传递,您可以尝试如下:

代码语言:javascript
复制
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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39946281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档