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)) при создании списка. Здесь неприменима ленивая оценка? Есть ли другое решение, позволяющее избежать оценки?
вы также можете переопределить [: "[" <- function(a,...) if (is.null(a)) NULL else .Primitive("[")(a,...) (это может испортить все остальное ... поэтому, если бы я подумал об этом, я бы определил его прямо перед использованием и удалил его сразу после использования)
@Moody_Mudskipper: вы правы, я пытался сократить путь и полностью исключить переменные NULL, используя if (!is.null(arg1)) var1 = arg1[eval of complex calculation 1], что привело к ошибке. Тем не менее мне кажется любопытным, почему R вообще выполняет оценку части подмножества.
NULL[1/"a"] возвращает ошибку, что полезно во многих случаях, я также считаю, что ваша ситуация довольно редка (где подмножество NULL является узким местом), и есть вероятность, что с ней можно было бы справиться в восходящем направлении более элегантным способом





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