R工作区可能包含的对象的数量(不是大小)是否有限制? length(e)
的最大可能值是多少,其中e
是一个环境?
(length(e)
包含e
中的变量数量;它与length(ls(e))
相同。)
答案 0 :(得分:4)
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
中的对象。我认为没有理由不指定子环境,每个子环境中都有.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在下面的评论中所述。