R не сообщает об ошибке, когда аргумент функции не предоставлен, но используется для подстановки вектора - PullRequest
0 голосов
/ 26 апреля 2018

Почему не сообщается об ошибке, если 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?Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

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:

Пустой индекс выбирает все значения: чаще всего он используется для замены всех записей, но сохраняет атрибуты.

0 голосов
/ 26 апреля 2018

Это связано с функцией [, а не с ленивой оценкой.Вы получите ошибку, если сделаете следующее:

f3 <- function(a,b) {a+b}; f3(a = 1)

Обратите внимание, что поскольку b не определено, R интерпретирует его так, как если бы его не существовало.Попробуйте сделать:

a <- c(1,1) 
a[]

Кажется, что функция поднабора (`[`) фактически принимает ... в качестве параметра.То есть указание индексов для подмножества не является обязательным.

...