2016-10-30 1 views
6

Я не могу понять, где R сохраняет данные для ecdf. Вот код, чтобы проиллюстрировать это:Где: `ecdf`, сохраняющий свой объект? (и как его измерить?)

> set.seed(2016-10-30) 
> x <- rnorm(1e4) 
> y <- ecdf(x) 
> object.size(x) 
80040 bytes 
> object.size(y) 
3896 bytes 
> rm(x) 
> gc() 
      used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 602079 32.2 1168576 62.5 750400 40.1 
Vcells 1183188 9.1 299644732 2286.2 750532746 5726.2 
> object.size(y) 
3896 bytes 
> plot(y) # still works... 
> 

Если размер у мал, это означает, что данные сохраняются где-то. Очевидно, что он не сохраняется в x (поскольку я удалил его).

  1. Возможно, это в какой-то среде, но как бы получить доступ к ней? Итак, где эти данные сохраняются и как их можно получить?
  2. Как бы это повлияло на memory.limit()? (т.е .: пределы кэширования или памяти запущенных процессов R)
+1

'pryr :: compare_size (y)' говорит вам, что он намного больше оценок 'base'. Другие функции 'pryr' могут сказать вам, где он думает, что есть указатели на переменные среды, которые не учитываются прямым вызовом' object.size'. – tchakravarty

+2

Попробуйте запустить 'eapply (environment (y), object.size)'. – nrussell

+1

@nrussell Это дает немного более низкую оценку, чем 'pryr :: object_size', потому что' ls (environment (y)) 'не находит' .approxfun', который 'codetools :: findGlobals' делает. – tchakravarty

ответ

5

Там фантастическое объяснение замыканий функций, объемлющий, исполняющие и призывающие среды в @ Хедлите Advanced R.

Для вашего конкретного примера, как было отмечено в комментариях, размер объекта, вместе с вмещающей средой гораздо больше:

pryr::compare_size(y) 

Вы можете увидеть объекты, что это влечет за собой, и их относительные размеры с помощью этого:

sapply(codetools::findGlobals(y), function(x) object.size(get(x, environment(y)))) 

Вы можете суммировать последний вектор, чтобы увидеть, что это действительно то, что pryr::object_size сообщает (164 кБ на моей машине).

3

Вы правильно угадали информацию (и размер) в среде y:

ls(envir = environment(y)) 
#[1] "f"  "method" "nobs" "x"  "y"  "yleft" "yright" 
str(environment(y)$x) 
3 num [1:10000] -4.01 -3.41 -3.39 -3.38 -3.34 ... 
str(environment(y)$y) 
# num [1:10000] 1e-04 2e-04 3e-04 4e-04 5e-04 6e-04 7e-04 8e-04 9e-04 1e-03 ... 

Вы получаете доступ имена содержимого среды с ls(). Его использование по умолчанию на консоли имеет параметр envir, назначенный globalenv(), так как это указывает pos = -1L. Вы можете получить доступ к значениям, используя $, как показано выше. Некоторые другие функции, в которых могут быть полезны знания об этой стратегии хранения данных, - это stepfun и многие функции сплайна.

+1

Мне интересно, какая ошибка вызывает понижение? –