Исходный код для ls()
(в src/main/envir.c
) определяет это возвращаемое значение, используя другую функцию: return R_lsInternal(env, all);
;
#2518 SEXP attribute_hidden do_ls(SEXP call, SEXP op, SEXP args, SEXP rho)
#2519 {
#2520 SEXP env;
#2521 int all;
#....
#2537 return R_lsInternal(env, all);
#2538 }
Функция возврата return R_lsInternal(env, all);
, принимает список сред и логическое значение, указывающее, следует ли получить все имена и определяется в line 2452 of the envir.c
. Он вычисляет длину имен объектов в среде (ов), хранящая длину в int
типа данных (k
ниже), поэтому число объектов в среде, должно быть ограниченно по максимальному размеру этого типа данных:
#2542 SEXP R_lsInternal(SEXP env, Rboolean all)
#2543 {
#2544 int k; <==== INTEGER TYPE DEFINED HERE LIMITS NUMBER OF OBJECTS IN ENVIRONMENT
#2545 SEXP ans;
#2546
#2547
#2548 /* Step 1 : Compute the Vector Size */
#2549 k = 0;
#2550 if (env == R_BaseEnv || env == R_BaseNamespace)
#2551 k += BuiltinSize(all, 0);
#...
#2562 /* Step 2 : Allocate and Fill the Result */
#2563 PROTECT(ans = allocVector(STRSXP, k));
#...
#2576 return ans;
#2577 }
Однако, это для объектов в указанном environment
. Я не вижу причин, по которым вы не можете указать суб-environements, каждый из которых мог бы иметь .Machine$integer.max
объектов в нем! Таким образом, ограничение должно ограничиваться только вашей машинной памятью. Я бы хотел, чтобы кто-то испытал это, хотя!
# Example of assigning values in sub environments...
e <- new.env()
e$f <- new.env()
# Environment `e` now has one object in, which is another environment...
length (ls(e))
# [1] 1
e$f$a <- 2
# Environment `f` now also has one object in, which is `a`
length (ls(e$f))
# [1] 1
Примечание: если вы вычислить длину объектов, используя length(e)
где e
это среда, то функция envlength
будет послана в качестве length
является внутренней родовой, для которого существует несколько методов, написанные для различных типов объектов, в том числе один для сред, как указано @RichieCotton выше и @hadley в комментариях ниже.
Не зависит ли это от размера самого маленького объекта и от того, сколько памяти вы можете использовать? – Jota
В 64-битной системе я думаю, что это 2^53-1. На ваш вопрос ответили: http://stackoverflow.com/a/21142236/602276 – Andrie
Я подозреваю, что это не более чем. .Machine $ integer.max # [1] 2147483647', поскольку индексирование выполняется в целочисленном режиме, но wouldn не удивляйтесь, чтобы найти нижний предел, наложенный деталями реализации. –