Проверить, установлен или нет аргумент функции в R - PullRequest
48 голосов
/ 01 ноября 2011

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

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

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

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

Ответы [ 3 ]

63 голосов
/ 01 ноября 2011

Для этого вы используете функцию 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.

7 голосов
/ 01 ноября 2011

Я думаю, «пропавший» должен это сделать.

6 голосов
/ 12 декабря 2013

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

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

См. Часть о Ленивых вычислениях в http://adv -r.had.co.nz / Functions.html

...