Мое предложение
Я думаю, что часть | 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)
).
Вы можете исправить это, используя ||
, а не |
, который оценил бы logbase == 10
, если is.null(logbase)
равен FALSE
, потому что если первая половина ||
равна TRUE
, то это просто возвращает TRUE
без оценки второй половины.