2012-06-06 27 views
13

¿Hay alguna forma de comprobar si dos objetos son idénticos en el lenguaje R?Identidad del objeto R

Para mayor claridad: no me refiero idénticos en el sentido de la función identical, que compara objetos basado en ciertas propiedades como valores numéricos o valores lógicos etc.

Estoy muy interesado en la identidad del objeto, que por ejemplo podría ser probado usando el operador is en el lenguaje Python.

+3

Para aquellos que no están familiarizados con Python, se puede elaborar sobre cómo definir la identidad (o digamos la igualdad)? En sentido estricto, un objeto solo puede ser idéntico consigo mismo. ¿Cuál sería el uso previsto de esta prueba? – Roland

+1

¿Te refieres a la clase de objetos? Por ejemplo 'is.numeric'? – Andrie

+0

@Andrie y Roland: Me refiero a la identidad en el sentido de la misma dirección en la memoria principal. Por ejemplo, en un lenguaje común como Python o Java, podría hacer algo como (sintaxis de módulo) b = new Object() c = b En este caso, byc apuntan al mismo objeto. –

Respuesta

22

ACTUALIZACIÓN: Una implementación más robusta y más rápido de address(x) (no usar .Internal(inspect(x))) se añadió a data.table v1.8.9. De NEWS:

Nueva función address() devuelve la dirección en la memoria RAM de su argumento. Algunas veces es útil para determinar si un valor ha sido copiado o no por R, programáticamente.


Hay probablemente una manera más ordenada, pero esto parece funcionar.

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 

Se puede modificarlo para trabajar en 32 bits cambiando 17 a 9.

+0

Esto es interesante. ¿Sabes dónde podría leer un poco más acerca de cuándo R realmente crea objetos nuevos y cuándo solo señala objetos existentes en la memoria? – Roland

+1

@Roland Hm. Pensé que sería fácil buscar y encontrar algunos enlaces, pero parece que no. Todo lo que he encontrado es [sección 1.1.2 de R Internals] (http://cran.r-project.org/doc/manuals/R-ints.html#Rest-of-header) que explica cómo la llamada- se implementa la ilusión por valor. Tiendo a experimentar con 'tracemem' y' .Internal (inspeccionar (...)) 'para hacer ejercicio cuando se hacen copias. Hacer eso llevó a [este post a r-devel] (http://r.789695.n4.nabble.com/Confused-about-NAMED-tp4103326.html) que podría dar más pistas. –

+0

Gracias. El hilo en r-devel es bastante interesante y creo que aprendí algo de él, aunque está un poco por encima de mi nivel actual de educación de programación. :) – Roland

0

Puede usar el paquete pryr.

Por ejemplo, devolver la posición de memoria del objeto mtcars:

pryr::address(mtcars) 

Entonces, para las variables a y b, se puede comprobar:

address(a) == address(b) 
Cuestiones relacionadas