Почему R оценивает подмножество NULL?

AFAIK, любое подмножество NULL, такое как NULL[1] в R, снова вернет NULL. Однако кажется, что R все еще оценивает часть, используемую для подмножества:

system.time(NULL[1])
   user  system elapsed 
      0       0       0 
system.time(sample(1e7))
   user  system elapsed 
  0.582   0.010   0.598 
system.time(NULL[sample(1e7)])
   user  system elapsed 
  0.575   0.011   0.594

Я использую это в контексте создания списка внутри функции, как в

l <- list(
    var1 = arg1[eval of complex calculation 1]
    var2 = arg2[eval of complex calculation 2]
    ...etc
    )

где любой из аргументов (arg) функции может иметь значение NULL.

Без оценки сложных вычислений это сэкономило бы много времени, но я думаю, что не могу обойти оценку, тестируя if (is.null(arg)) при создании списка. Здесь неприменима ленивая оценка? Есть ли другое решение, позволяющее избежать оценки?

почему бы и нет, можно сделать var1 = if (is.null(arg1)) NULL else arg1[eval of complex calculation 1]

Moody_Mudskipper 24.04.2018 19:27

вы также можете переопределить [: "[" <- function(a,...) if (is.null(a)) NULL else .Primitive("[")(a,...) (это может испортить все остальное ... поэтому, если бы я подумал об этом, я бы определил его прямо перед использованием и удалил его сразу после использования)

lebatsnok 24.04.2018 19:35

@Moody_Mudskipper: вы правы, я пытался сократить путь и полностью исключить переменные NULL, используя if (!is.null(arg1)) var1 = arg1[eval of complex calculation 1], что привело к ошибке. Тем не менее мне кажется любопытным, почему R вообще выполняет оценку части подмножества.

MartijnVanAttekum 24.04.2018 22:36
NULL[1/"a"] возвращает ошибку, что полезно во многих случаях, я также считаю, что ваша ситуация довольно редка (где подмножество NULL является узким местом), и есть вероятность, что с ней можно было бы справиться в восходящем направлении более элегантным способом
Moody_Mudskipper 24.04.2018 22:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
49
0

Другие вопросы по теме