2014-09-15 18 views
6

Bir R çalışma alanının içerebileceği nesnelerin sayısı (boyut değil) üzerinde bir sınır var mı? ortamının length(e) maksimum olası değeri nedir?r Çalışma alanındaki nesnelerin azami sayısı

(length(e)e değişkenin sayı içerir bu length(ls(e)) aynıdır.)

+0

Mümkün olan en küçük nesnenin boyutuna ve kullanabileceğiniz boş bellek miktarına bağlı olmaz mı? – Jota

+1

64-bit bir sistemde 2^53-1 olduğunu düşünüyorum. Sorunuz şu adreste yanıtlandı: http://stackoverflow.com/a/21142236/602276 – Andrie

+0

İndeksleme tamsayı modunda yapıldığından, ancak .machine $ integer.max # [1] 2147483647''den daha fazla bir şey olmadığından şüpheleniyorum. Uygulama detaylarının dayattığı alt limiti bulmaya şaşırmayın. –

cevap

3

ls() (src/main/envir.c olarak) için kaynak kodu, başka bir işlev kullanılarak geri değer tanımlar: 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 } 

dönüş fonksiyonu return R_lsInternal(env, all);, ortamlar ve bütün isimleri almak ve line 2452 of the envir.c tanımlanır olup olmadığını gösteren bir boolean bir listesini alır.

#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 } 
: Bu nedenle bir ortamda nesnelerin sayısı, bu veri türü maksimum boyutu ile sınırlı olmalıdır, bir ortam (lar) (aşağıda k) bir int veri türü uzunluğunun depolanması için nesnelerin isimleri uzunluğunu hesaplar

Ancak, bu, belirtilen bir environment'daki nesneler içindir. Alt ortamları belirleyememenin hiçbir sebebi yok, bunların her biri .Machine$integer.max nesnesine sahip olabilir! Dolayısıyla sınır sadece makine belleğiniz tarafından sınırlandırılmalıdır. Bunu test etmek için birini çok isterim!

# 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 

Not: e işlev envlengthlength olarak sevk edilecek bir ortam, bir iç jenerik edilir olduğu length(e) kullanarak nesnelerin uzunluğunu hesaplamak eğer kendisi için bir tane olmak üzere çeşitli nesne türleri için yazılı çeşitli yöntemler vardır Aşağıdaki yorumlarda @RichieCotton ve @hadley tarafından belirtildiği gibi ortamlar için.

+0

'all', tüm değerleri döndürüp döndürmeyeceğinizi belirten bir boole (bir int saklanır) - ls()' nin dönüş değeri değil. – hadley

+0

İlgili işlev aslında "envlength", https://github.com/wch/r-source/blob/24a4576064961a51154f096519f20177096edec1/src/main/envir şeklindedir.C# L2747 – hadley

+1

@hadley, Richie Cotton ('length (ls())') tarafından düzenlemeden önce çerçevelenmiş olduğu gibi soruna göre değil. Ve eğer sorularımın ikinci yarısını okumaktan rahatsız olursanız, asla "bu" ile ilgili hiçbir iddiada bulunmadığımı anlayacaksınız. Ben özellikle dönme değerini geri döndürün R_lsInternal (env, all); 'hala' int' maksimum boyutu ile sınırlıdır. Ve ben bunu belirtmeme rağmen, 'R_lsinternal' fonksiyonunun 'ans' fonksiyonunun (referansta bulunduğum) 'ans'inin şu andan itibaren ortaya çıkmasıdır:' PROTECT (ans = allocVector (STRSXP, k)); 've' k 'bir' int'dir. –

İlgili konular