Почему не сообщается об ошибке, если b не указан, но требуется внутри функции? Спасибо!
f2 <- function(a,b) {a[b]}; f2(a=rep(1, 2))
Я так понимаю, что в этой функции нет ошибки:
f <- function(x) {
10
}
f(stop("This is an error!"))
из-за ленивой оценки Но это
f <- function(x) {
force(x)
10
}
f(stop("This is an error!"))
или это
f <- function(x) {
x
10
}
f(stop("This is an error!"))
выдаст ошибку. Потому что в обоих случаях x в функции равен использовал. Оба приведенных выше примера взяты из http://adv-r.had.co.nz/Functions.html. Поскольку b также является использовал внутри f2, нужно ли добавлять силу внутри f2? Спасибо!
Я предполагаю, что это какая-то причуда ленивой оценки, которую я не полностью понимаю, поскольку, если вы используете debug(f2), вы можете увидеть, что b возвращается из ls() внутри среды функции. f2 <- function(a,b) {a[force(b)]}; f2(a=1:2) также выходит из строя, когда ?force используется с ошибкой "аргумент "b" отсутствует". Источник: stackoverflow.com/questions/29733257/…
Но я думаю, что в приведенной выше ссылке исходная функция f не использовал. stackoverflow.com/questions/29733257/…





Это связано с функцией [, а не с ленивой оценкой. Вы получите сообщение об ошибке, если сделаете следующее:
f3 <- function(a,b) {a+b}; f3(a = 1)
Обратите внимание: поскольку b не определено, R интерпретирует его так, как будто его не существует. Попробуйте сделать:
a <- c(1,1)
a[]
Похоже, что функция подмножества (`[`) на самом деле принимает ... в качестве параметра. То есть, указание индексов для подмножества необязательно.
Спасибо! Как насчет a <- c (1, 1); a [b] без определения b? Это вызовет ошибку, поскольку b не определен. Но почему внутри функции все по-другому?
Опять же, сравните, что происходит, когда вы это делаете: f4 <- function(a, ...) {a+...}; f4(1); f4(1,1); f4(1, c(1,1)). Для функции подмножества индексы являются необязательными (...). Когда вы вызываете f2, как указано выше, R ищет переменную b в среде, но, поскольку она не может ничего сопоставить, выполняет эту функцию только с a. Это не работает в моем примере f3, потому что для сложения по определению требуются две переменные.
@DavidKlotz - но b действительно существует в среде. debug(f2); f2(a=1), затем exists("b") возвращает TRUE. Значит, он существует, но не оценивается, не так ли?
Он определен в вызове функции, но все еще отсутствует: f2 <- function(a,b) {print(missing(a)); print(missing(b)); a[b]}; f2(a=rep(1, 2))
Понятно, спасибо обоим! Иногда я мог забыть включить вторую переменную b при вызове функции f2. Это лучший способ всегда использовать f <- function (a, b) {a [force (b)]} всякий раз, когда я делаю подмножество внутри функции для защиты от этого риска?
Здесь все правильно, кроме части про .... Если бы был задействован ..., `[`(a, i = 1, foo = 1) подействовал бы.
Лучший способ - явно проверить отсутствие: f <- function(a, b) if (missing(b)) stop('b is missing.') else a[b]
Хорошая мысль, @Roland. Итак, что на самом деле происходит, так это то, что исходный код для функции подмножества (цитируется @Hugh) явно имеет дело со случаем отсутствующего или пустого индекса.
x[b] возвращает (дубликат) x, если b отсутствует. Из источника R:
static SEXP VectorSubset(SEXP x, SEXP s, SEXP call)
{
R_xlen_t stretch = 1;
SEXP indx, result, attrib, nattrib;
if (s == R_MissingArg) return duplicate(x);
https://github.com/wch/r-source/blob/ec2e89f38a208ab02449b706e13f278409eff16c/src/main/subset.c#L169
Из документации, в которой «пустой» означает «отсутствует», а не NULL:
An empty index selects all values: this is most often used to replace all the entries but keep the attributes.
Более простая версия, та же проблема -
f2 <- function(a,b) {a[b]}; f2(a=1)