2014-09-15 5 views
6

Существует ли ограничение на количество (не размер) объектов, которое может содержать пространство операций R? Каково максимально возможное значение length(e), где e - это окружающая среда?Максимальное количество объектов в рабочей области r

(length(e) содержит число переменных в e, оно такое же, как length(ls(e)).)

+0

Не зависит ли это от размера самого маленького объекта и от того, сколько памяти вы можете использовать? – Jota

+1

В 64-битной системе я думаю, что это 2^53-1. На ваш вопрос ответили: http://stackoverflow.com/a/21142236/602276 – Andrie

+0

Я подозреваю, что это не более чем. .Machine $ integer.max # [1] 2147483647', поскольку индексирование выполняется в целочисленном режиме, но wouldn не удивляйтесь, чтобы найти нижний предел, наложенный деталями реализации. –

ответ

3

Исходный код для 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 в комментариях ниже.

+0

'all' является логическим (хранится в int), указывающим, нужно ли возвращать все значения - это не возвращаемое значение' ls() '. – hadley

+0

Соответствующая функция на самом деле 'envlength', https://github.com/wch/r-source/blob/24a4576064961a51154f096519f20177096edec1/src/main/envir.C# L2747 – hadley

+1

@hadley не в соответствии с вопросом, поскольку он был первоначально оформлен до редактирования Richie Cotton ('length (ls())'). И если вы потрудились прочитать вторую половину моего вопроса, вы поймете, что я никогда не делаю это утверждение о «все». Я конкретно указываю, что возвращаемое значение 'return R_lsInternal (env, all);' все еще ограничено максимальным размером 'int'. И хотя я не утверждаю это, это потому, что экземпляр возвращаемого вектора 'ans' функции' R_lsinternal' (который ссылается!) Создается таким образом: 'PROTECT (ans = allocVector (STRSXP, k));' и ' k' является 'int'. –