Saya sedang dalam proses membuat paket yang menggunakan data.table
sebagai kumpulan data dan memiliki beberapa fungsi yang ditetapkan berdasarkan referensi menggunakan :=
.
Saya telah membuat paket sederhana untuk mendemonstrasikan problem
saya
library(devtools)
install_github('foo','mnel')
Ini berisi dua fungsi
foo <- function(x){
x[, a := 1]
}
fooCall <- function(x){
eval(substitute(x[, a :=1]),parent.frame(1))
}
dan kumpulan data (bukan pemuatan lambat) DT
, dibuat menggunakan
DT <- data.table(b = 1:5)
save(DT, file = 'data/DT.rda')
Ketika saya menginstal paket ini, pemahaman saya adalah bahwa foo(DT)
harus ditetapkan dengan referensi dalam DT
.
library(foo)
data(DT)
foo(DT)
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
# However this has not assigned by reference within `DT`
DT
b
1: 1
2: 2
3: 3
4: 4
5: 5
Jika saya menggunakan lebih banyak correct
tracmem(DT)
DT <- foo(DT)
# This works without copying
DT
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
untracemem(DT)
Jika saya menggunakan eval
dan substitute
dalam fungsinya
fooCall(DT)
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
# it does assign by reference
DT
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
Haruskah saya bertahan
DT <- foo(DT)
atau ruteeval
/substitute
, atau- Apakah ada sesuatu yang saya tidak mengerti tentang cara
data
memuat kumpulan data, meskipun tidak malas?
DT
di akhir sini tidak berarti itu ditetapkan berdasarkan referensi bukan? DT bisa saja disalin ke.GlobalEnv
dan mungkin di situlah DT diperbarui. - person Matt Dowle   schedule 04.03.2013tracemem
melaporkan duplikasi oleh R sendiri. Kecil kemungkinannya untuk menangkap salinan yang data.table lakukan, misalnya saat melakukan alokasi berlebihan untuk pertama kalinya karena secara teknis itu bukan duplikasi sempurna, namun alokasi berlebihan (walaupun salinan dangkal bukan salinan dalam). - person Matt Dowle   schedule 04.03.2013alloc.col
pada objek data dalam paket, dan lihat apa yang terjadi. - person Matt Dowle   schedule 04.03.2013data()
tapi ya, kedengarannya tidak salah. Tetapi R yang membuatnya (bukan data.tabel) yaitu perintahdata()
R yang tidak mengetahui tentang alokasi berlebihan. Mirip dengan saat Andaload()
sebuah data.tabel, itu tidak akan dialokasikan secara berlebihan sampai:=
pertama menambahkan kolom baru. Apakahlibrary(foo); data(DT); alloc.col(DT); foo(DT)
berfungsi? Lalu kita bisa pergi dari sana. - person Matt Dowle   schedule 04.03.2013library(foo); data(DT); alloc.col(DT); foo(DT)
berfungsi sesuai kebutuhan. - person mnel   schedule 05.03.2013