Sto aggiornando una serie di funzioni che in precedenza accettavano solo gli oggetti data.frame
per lavorare con gli argomenti data.table
.Viene eseguita una copia quando la funzione restituisce un data.table?
Ho deciso di implementare la funzione utilizzando l'invio del metodo di R in modo che il vecchio codice che utilizza data.frame
s continui a funzionare con le funzioni aggiornate. In una delle mie funzioni, prendo un data.frame
come input, lo modifico e restituisco lo data.frame
modificato. Ho creato anche un'implementazione data.table
. Per esempio:
# The functions
foo <- function(d) {
UseMethod("foo")
}
foo.data.frame <- function(d) {
<Do Something>
return(d)
}
foo.data.table <- function(d) {
<Do Something>
return(d)
}
So che data.table
opere apportare modifiche senza copiare, e ho implementato foo.data.table
tenendo questo in mente. Tuttavia, restituisco l'oggetto data.table
alla fine della funzione perché voglio che i miei vecchi script funzionino con i nuovi oggetti data.table
. Questo farà una copia dello data.table
? Come posso controllare? Secondo la documentazione, uno deve essere molto esplicito per creare una copia di uno data.table
, ma non sono sicuro in questo caso.
Il motivo che voglio restituire qualcosa quando io non devo con data.tables
:
miei vecchi script simile a questa
someData <- read.table(...)
...
someData <- foo(someData)
voglio gli script per essere in grado di correre con data.table
s da basta cambiare le righe di ingest dei dati. In altre parole, voglio che lo script funzioni semplicemente cambiando someData <- read.table(...)
a someData <- fread(...)
.
Solo le funzioni ': =' e 'set *' modificano 'data.table' per riferimento. Quindi, se stai usando ': =' o una qualsiasi delle funzioni di 'set *' all'interno della tua funzione, potresti dover lavorare su 'copy (d)' se non vuoi che 'd' sia modificato come riferimento . Per esempio: se lo fai: 'ans <- d [, lapply (.SD, sum), by = cols]', allora non c'è nulla di cambiato in riferimento qui. – Arun
@Arun Scusa se la mia domanda non è chiara. Voglio che 'd' sia modificato per riferimento, quindi ho fatto uso delle funzioni': = 'e' set * 'per modificare' data.table' nella mia funzione 'foo.data.table'. Se modifico 'd' all'interno della funzione per riferimento, allora' return (d) 'restituisce una copia di' d'? – ialm
no, non è così .. puoi usare 'tracemem' per controllare queste cose in generale. Es: 'foo <- function (x) {x [, bar: = 1L]; return (x)}; x = data.table (a = 1: 5, b = 6: 10); tracemem (x); foo (x) '. Risulterà in alcuni verbose dopo 'foo (x)' se è stata fatta una copia. In alternativa puoi usare la funzione 'address()' per verificare se le colonne di 'x' hanno lo stesso indirizzo prima e dopo la funzione .. e se è così, nessuna copia è stata fatta. – Arun