我想在以下函数中使用可选参数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
答案 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
的求值结果不是T
或F
(它是logical(0)
)。 br />
您可以使用||
而不是|
来解决此问题,如果logbase == 10
是is.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