Проверьте, установлен ли аргумент функции или нет в R

#r #function #variables #variable-assignment #isset

#r #функция #переменные #присваивание переменной #isset

Вопрос:

У меня есть функция f , которая принимает два параметра ( p1 и p2 ):

Если для параметра p2 функции не было передано значение, p1 вместо него следует использовать значение ^ 2 . Но как я могу узнать внутри функции, задано ли значение или нет. Проблема в том, что переменная p2 не инициализируется, если не было значения. Таким образом, я не могу проверить p2 , является NULL ли он.

 f <- function(p1, p2) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}
 

Можно ли как-то проверить, было ли p2 передано значение для функции или нет? (Я не смог найти isset() — function или подобные вещи.)

Ответ №1:

missing() Для этого вы используете функцию.

 f <- function(p1, p2) {
    if(missing(p2)) {
        p2=p1^2
    }
    p1-p2
}
 

В качестве альтернативы вы можете установить значение p2 равным NULL по умолчанию. Иногда я предпочитаю это решение, поскольку оно позволяет передавать аргументы вложенным функциям.

 f <- function(p1, p2=NULL) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}

f.wrapper <-function(p1,p2=NULL){
    p1 <- 2*p1
    f(p1,p2)
}
> f.wrapper(1)
[1] -2
> f.wrapper(1,3)
[1] -1
 

РЕДАКТИРОВАТЬ: вы могли бы сделать это технически и с missing() помощью, но тогда вам также пришлось бы включить missing() оператор f.wrapper .

Комментарии:

1. 1 для NULL альтернативы по умолчанию. Re: добавленное вами РЕДАКТИРОВАНИЕ, как бы вы передали missing ‘ness через функцию-оболочку?

2. @Josho’Brien Передача missing данных является сложной, но возможной. Вот почему NULL в этом случае все намного проще.

3. … Таким образом, отдельный вопрос может быть оправдан для передачи missing .

4. @Josho’Brien Это должно быть if(missing(p2)) f(p1) else f(p1,p2) . Или вы можете передать аргументы, используя аргумент dots .

5. Спасибо. Черт возьми, я не вижу, как это сделать с точками, если обе функции имеют формальные аргументы p1 и p2 . Другой вариант использует следующее в теле f.wrapper() : {cl <- match.call(); cl$p1 <- 2*p1; cl[[1]] <- f; eval(cl)} . Все это показывает, насколько чище ваша NULL альтернатива на самом деле!

Ответ №2:

Я думаю, что ‘?missing’ должен это сделать.

Ответ №3:

В подобном случае вы также можете использовать что-то вроде этого:

 f <- function(p1, p2 = p1 ^ 2) {
    p1-p2
}
 

Смотрите Часть о отложенной оценке по адресу http://adv-r.had.co.nz/Functions.html

Комментарии:

1. Обычно я пишу это так, поэтому, когда было missing бы наиболее подходящим?

2. @Diego, если вы посмотрите на ?недостающую документацию, вы найдете пример, который было бы сложно реализовать с использованием этой техники.