Разница в объеме между отсутствующим () и is.null () - PullRequest
1 голос
/ 16 января 2020

Мне трудно понять разницу между is.null и missing, в частности, почему следующее не работает для is.null, но работает для missing:

foo_iris <- function(a = NULL){
  if(!is.null(a)) return('not.null') else  return('is.null')
}

foo_iris(a = Species)
#> Error in foo_iris(a = Species): object 'Species' not found

foo_iris <- function(a = NULL){
  if(missing(a)) return('is.null') else return('not.null')
}

foo_iris(a = Species)
#> [1] "not.null"

Создано в 2020-01-16 пакетом Представления (v0.3.0)

Ответы [ 2 ]

5 голосов
/ 16 января 2020

Это не относится к области видимости.

R имеет ленивую оценку, что означает, что аргументы оцениваются только в случае необходимости. is.null необходимо оценить a, чтобы проверить, является ли это ссылкой на объект NULL. Эта оценка выдает ошибку. missing не оценивает a, см. Документацию в help("missing"):

Это «специальная» примитивная функция: она не должна оценивать свой аргумент.

2 голосов
/ 16 января 2020

Вам нужно изменить ваш код следующим образом:

foo_iris <- function(a = NULL){
    if(exists(deparse(substitute(a))) && !is.null(a)) return('not.null') else  return('is.null')
}

foo_iris(a = Species)

Здесь exists(deparse(substitute(a))) проверяет наличие объекта, а с lazy и && он также оценивает is.null(). Без ленивого eval is.null() потерпит неудачу из-за отсутствия объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...