在R函数中使用可选参数

时间:2019-04-13 06:29:45

标签: r function arguments optional

我想在以下函数中使用可选参数logbase = NULL。但是无法找出最佳实践。请提供任何提示。

fn1 <- function(x, logbase = NULL){
  logbase <- ifelse(test = is.null(logbase) | 10, yes = 10, no = logbase)
  out <- log(x = x, base = logbase)
  return(out)
}

fn1(x = 10, logbase = NULL)
1

错误答案

fn1(x = 10, logbase = 2)
1

错误答案

fn1(x = 10, logbase = exp(1))
1

2 个答案:

答案 0 :(得分:2)

我的建议
我认为| 10部分是造成此问题的原因,并且由于logbase为10时,无论测试的评估结果为TRUE还是FALSE,您都可以得到相同的结果,只需将其删除即可。我知道您在评论中说过,此操作无法按预期运行,但对我来说似乎如此-如果仍然不适合您,请随时发表评论。

fn1 <- function(x, logbase = NULL){
  logbase <- ifelse(test = is.null(logbase), yes = 10, no = logbase)
  out <- log(x = x, base = logbase)
  return(out)
}

fn1(x = 10, logbase = NULL)    # 1
fn1(x = 10, logbase = 2)       # 3.321928
fn1(x = 10, logbase = exp(1))  # 2.302585

您的代码有什么问题
问题在于,| 10的任何内容都将始终评估为TRUE。这是因为|运算符会将两边的参数都转换为logical,因此类似is.null(2) | 10的事物等同于as.logical(is.null(2)) | as.logical(10),其结果为F | T,即T

要清楚,| 10与日志库无关。您要找的大概是| logbase == 10。这很好,除非logbase为NULL,否则您会遇到问题,因为NULL == 10的求值结果不是TF(它是logical(0))。 br /> 您可以使用||而不是|来解决此问题,如果logbase == 10is.null(logbase),则FALSE只会评估||,因为如果{ {1}}是TRUE,那么它只返回TRUE而无需评估后半部分。

答案 1 :(得分:1)

这是一个变体:

fn1 <- function(x, logbase = NULL){
   if(is.null(logbase)||logbase==10){
   logbase=10
    #logbase <- ifelse(test = is.null(logbase) | 10, yes = 10, no = logbase)
    out <- log(x = x, base = logbase)
    return(out)
  }
 else{
   log(x = x, base = logbase)#?exp(logbase)
 }


}

测试:

fn1(x = 10, logbase = 2)
[1] 3.321928