Использование необязательных аргументов в функции R - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу использовать необязательный аргумент 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 ]

2 голосов
/ 13 апреля 2019

Мое предложение
Я думаю, что часть | 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 без оценки второй половины.

1 голос
/ 13 апреля 2019

Вот вариант:

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
...