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