2012-06-06 12 views
13

esiste un modo per verificare se due oggetti sono identici nella lingua R?Identità oggetto R

Per chiarezza: non intendo identica nel senso della funzione identical, che confronta gli oggetti sulla base di determinati immobili come valori numerici o valori logici ecc

Sono davvero interessato identità dell'oggetto, che per esempio potrebbe essere testato usando l'operatore is nel linguaggio Python.

+3

Per chi non ha familiarità con Python, si può approfondisci come definisci l'identità (o diciamo l'identità)? In senso stretto un oggetto può essere identico a se stesso. Quale sarebbe l'uso previsto di questo test? – Roland

+1

Intendi classe oggetto? Ad esempio 'is.numeric'? – Andrie

+0

@Andrie e Roland: intendo identità nel senso dello stesso indirizzo nella memoria principale. Ad esempio, in un linguaggio comune come Python o Java, potrei fare qualcosa di simile (sintassi del modulo) b = nuovo oggetto() c = b In questo caso, b e c puntano allo stesso oggetto. –

risposta

22

UPDATE: Una più robusta e più rapida implementazione di address(x) (se non utilizzano .Internal(inspect(x))) è stato aggiunto al data.table v1.8.9. Da NEWS:

Nuova funzione address() restituisce l'indirizzo nella RAM del suo argomento. A volte utile per determinare se un valore è stato copiato o meno da R, in modo programmatico.


C'è probabilmente un modo più ordinato, ma questo sembra funzionare.

address = function(x) substring(capture.output(.Internal(inspect(x)))[1],2,17) 
x = 1 
y = 1 
z = x 
identical(x,y) 
# [1] TRUE 
identical(x,z) 
# [1] TRUE 
address(x)==address(y) 
# [1] FALSE 
address(x)==address(z) 
# [1] TRUE 

Si potrebbe modificarlo per lavorare su 32bit modificando 17-9.

+0

Questo è interessante. Sai dove potrei leggere un po 'di più quando R crea effettivamente nuovi oggetti e quando punta semplicemente a oggetti esistenti nella memoria? – Roland

+1

@Roland Hm. Ho pensato che sarebbe stato facile cercare e trovare alcuni collegamenti, ma non sembra. Tutto quello che ho trovato è [sezione 1.1.2 di R Internals] (http://cran.r-project.org/doc/manuals/R-ints.html#Rest-of-header) che spiega come la chiamata l'illusione di valore è implementata. Tendo a sperimentare con 'tracemem' e' .Internal (inspect (...)) 'per capire quando vengono fatte le copie. Ciò ha portato a [questo post su r-devel] (http://r.789695.n4.nabble.com/Confused-about-NAMED-tp4103326.html) che potrebbe fornire ulteriori indizi. –

+0

Grazie. Il thread su r-devel è piuttosto interessante e credo di aver imparato qualcosa da esso, anche se è un po 'al di sopra del mio livello attuale di educazione alla programmazione. :) – Roland

0

È possibile utilizzare il pacchetto pryr.

Per esempio, restituire la locazione di memoria dell'oggetto mtcars:

pryr::address(mtcars) 

Poi, per le variabili a e b, è possibile controllare:

address(a) == address(b)