2012-02-27 9 views
5

Recientemente supe que puedo usar identical o all.equal para verificar si 2 conjuntos de datos son idénticos.compruebe si 2 programas R son idénticos

¿Puedo usarlos también para verificar si 2 programas R son idénticos? ¿Hay una manera mejor o más adecuada que debajo?

program.1 <- readLines("c:/r stuff/test program 1.r") 
program.2 <- readLines("c:/r stuff/test program 2.r") 

identical(program.1, program.2) 
all.equal(program.1, program.2) 
isTRUE(all.equal(program.1, program.2)) 

Gracias por cualquier pensamiento o consejo.

Éstos son los contenidos de los programas de 2 pruebas que se comparan:

a <- matrix(2, nrow=3, ncol=4) 

b <- c(1,2,3,4,5,6,7,8,6,5,4,3,2) 

table(b) 

c <- runif(2,0,1) 

a * b 

# de marzo de 2012 Edición comienza aquí #

Aquí está un pequeño programa de ejemplo para los que la función de Josh siguiente restituye FALSE mientras identical y all.equal return TRUE. Yo nombro los dos archivos de programa 'testa.r' y 'testb.r'.

set.seed(123) 

y <- rep(NA, 10) 

s <- matrix(ceiling(runif(10,0,100)), nrow=10, byrow=T) 

a <- 25 
ab <- 50 
abc <- 75 

for(i in 1:10) { 
    if(s[i] > a & s[i] <= ab) y[i] = 1 
    if(s[i] > ab & s[i] <= abc) y[i] = 2 
} 

s 
y 

Aquí es el programa de I utilizo para leer los dos archivos que contienen el código de seguridad.

program.1 <- readLines("c:/users/Mark W Miller/simple R programs/testa.r") 

program.2 <- readLines("c:/users/Mark W Miller/simple R programs/testb.r") 


identical(program.1, program.2) 
all.equal(program.1, program.2) 
isTRUE(all.equal(program.1, program.2)) 


parseToSame <- function(file1, file2) { 
    a <- parse(file = file1) 
    b <- parse(file = file2) 
    attributes(a) <- NULL 
    attributes(b) <- NULL 
    identical(a,b) 
} 

parseToSame(

    "c:/users/Mark W Miller/simple R programs/testa.r", 
    "c:/users/Mark W Miller/simple R programs/testb.r" 

) 
+3

¿Qué quiere decir con "idéntico"? Si quiere decir que el código fuente es literalmente el mismo, entonces simplemente puede usar 'diff'. –

+0

Supongo que no sé cómo usar 'diff'. Cuando lo intento con el ejemplo anterior, aparece un mensaje de error. Por 'idéntico', me refiero a que los dos programas son exactamente iguales con diferentes nombres. –

+0

¿Qué mensaje de error recibes? –

Respuesta

3

Sí, puede hacerlo. Pero pueden no ser lo suficientemente flexibles para sus necesidades. program.1 y program.2 tendrían que ser exactamente iguales, con el mismo código en las mismas líneas, etc. No se permitirían desplazamientos. @Jack Maney mencionó diff en los comentarios anteriores. Eso permite una mayor flexibilidad en líneas idénticas, tal vez compensado por 1 o más líneas. Tenga en cuenta que se refiere a la utilidad estándar diff, no a la función R diff().

La razón por la que los dos tendría que ser exactamente iguales es que readLines() lee las líneas de los archivos en como un vector de caracteres (strings):

> con <- textConnection("foo bar foo\nbar foo bar") 
> foo <- readLines(con) 
> close(con) 
> str(foo) 
chr [1:2] "foo bar foo" "bar foo bar" 

Al utilizar identical() y all.equal(), se comparará elemento 1 de program.1 con el elemento 1 de program.2, y así sucesivamente para todos los elementos (líneas). Incluso si el código era idéntico pero contenía un retorno de carro adicional, por ejemplo, tanto identical() como all.equal() devolverán FALSE porque los elementos de los dos vectores de caracteres no serán iguales en ningún sentido.

8

Aquí hay una función que podría ser un poco más útil, ya que comprueba si los dos archivos se analizan en el mismo árbol de expresiones. (Será por lo tanto encontrar el código en dos archivos a ser equivalente, incluso si tienen diferentes formatos, líneas en blanco adicionales y espacios, etc., siempre y cuando se analizan al mismo objeto.)

parseToSame <- function(file1, file2) { 
    a <- parse(file = file1) 
    b <- parse(file = file2) 
    attributes(a) <- NULL 
    attributes(b) <- NULL 
    identical(a,b) 
} 

He aquí una demostración de la función en acción:

# Create two files with same code but different formatting 
tmp1 <- tempfile() 
tmp2 <- tempfile() 
cat("a <- 4; b <- 11; a*b \n", file = tmp1) 
cat("a<-4 

    b <- 11 
    a*b \n", file = tmp2) 

# Test out the two approaches 
identical(readLines(tmp1), readLines(tmp2)) 
# [1] FALSE 
parseToSame(tmp1, tmp2) 
# [1] TRUE 
+0

Gracias. Tengo tu función para ejecutar con parseToSame ( 'C:/r programa de la materia/de prueba 1.R', 'C:/r programa de la materia/de prueba 2.R' ) También estoy tratando de aprender usar la función de línea de comando diff ... ... o 'fc.exe'. –

+0

frijoles fríos. Vale la pena señalar que la función seguirá siendo descartada por diferencias sin importancia (para nosotros) como '1: 3' contra' c (1,2,3) ', o' x <-4' contra 'x <- 4L' (pero no 'x <-4' vs' x <-4.000'), ¡así que úselo con cuidado! –

+0

No sé lo que estoy haciendo mal, pero cuando pruebo su función en un programa R real, estoy usando en mi investigación los tres enfoques en mi pregunta original, todos dicen VERDADERO y su función dice FALSO. Simplemente abrí un archivo y lo guardé con un nombre nuevo (aunque más largo) pero no hice ninguna otra pulsación de tecla y repetí el proceso tres veces. Perdón por mi confusión. Gracias por la sugerencia. –

Cuestiones relacionadas