r工作空间中的最大对象数

时间:2014-09-15 05:50:32

标签: r

R工作区可能包含的对象的数量(不是大小)是否有限制? length(e)的最大可能值是多少,其中e是一个环境?

length(e)包含e中的变量数量;它与length(ls(e))相同。)

1 个答案:

答案 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在下面的评论中所述。