2016-10-30 16 views
6

Tôi dường như không thể hiểu nơi R lưu dữ liệu cho ecdf. Dưới đây là một số mã để minh họa điều này:`ecdf` lưu đối tượng của nó ở đâu? (và làm thế nào để đo lường nó?)

> 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... 
> 

Nếu kích thước của y nhỏ, nghĩa là dữ liệu được lưu ở đâu đó. Nó rõ ràng là không được lưu trong x (khi tôi gỡ bỏ nó).

  1. Có thể trong một số môi trường, nhưng làm cách nào chúng tôi truy cập? Vậy dữ liệu này được lưu ở đâu và nó có thể được truy cập như thế nào?
  2. Điều này sẽ ảnh hưởng thế nào đến memory.limit()? (tức là: giới hạn bộ nhớ đệm hoặc bộ nhớ khi chạy các quy trình R)
+1

'pryr :: compare_size (y)' cho bạn biết rằng nó lớn hơn nhiều so với ước tính 'cơ sở'. Các hàm 'pryr' khác có thể cho bạn biết nơi mà nó nghĩ rằng có các con trỏ tới các biến môi trường không được tính bằng một lệnh gọi trực tiếp đến' object.size'. – tchakravarty

+2

Thử chạy 'eapply (môi trường (y), object.size)'. – nrussell

+1

@nrussell Điều này đưa ra ước tính thấp hơn một chút so với 'pryr :: object_size' vì' ls (environment (y)) 'không tìm thấy' .approxfun', mà 'codetools :: findGlobals' làm. – tchakravarty

Trả lời

5

Có một giải thích tuyệt vời về đóng cửa chức năng, môi trường xung quanh, thực thi và gọi trong @ hadley's Advanced R.

Ví dụ cụ thể của bạn, như đã nêu trong các ý kiến, kích thước của các đối tượng, cùng với môi trường kèm theo của nó là lớn hơn nhiều:

pryr::compare_size(y) 

Bạn có thể xem các đối tượng này đòi hỏi, và kích cỡ tương đối của chúng sử dụng này:

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

Bạn có thể tổng hợp các vector cuối cùng để thấy rằng đây thực sự là những gì pryr::object_size được báo cáo (164 kB trên máy tính của tôi).

3

Bạn đang đúng trong đoán thông tin (và kích thước) đang ở trong môi trường của 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 ... 

Bạn truy cập vào tên của nội dung của một môi trường với ls(). Việc sử dụng mặc định của nó tại bàn điều khiển có tham số envir được gán cho globalenv() vì đó là những gì pos = -1L chỉ định. Bạn có thể truy cập các giá trị sử dụng $ như minh họa ở trên. Một số chức năng khác khi biết về chiến lược lưu trữ dữ liệu này có thể hữu ích là stepfun và nhiều chức năng spline.

+1

Tôi tự hỏi lỗi nào đã gây ra downvote? –

Các vấn đề liên quan