проверьте, идентичны ли 2 программы R - PullRequest
5 голосов
/ 28 февраля 2012

Недавно я узнал, что могу использовать identical или all.equal, чтобы проверить, идентичны ли 2 набора данных.

Могу ли я также использовать их для проверки идентичности программ 2 R? Есть ли лучший или более подходящий способ, чем приведенный ниже?

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))

Спасибо за любые мысли или советы.

Вот содержимое 2 сравниваемых тестовых программ:

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

# Март 2012 Править начинается здесь #

Вот небольшой пример программы, для которой приведенная ниже функция Джоша возвращает FALSE, тогда как identical и all.equal возвращают TRUE. Я называю два программных файла «testa.r» и «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

Вот программа R, которую я использую для чтения двух файлов, содержащих приведенный выше код.

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"

)

Ответы [ 2 ]

8 голосов
/ 28 февраля 2012

Вот функция, которая может быть немного более полезной, поскольку она проверяет, анализируют ли два файла одно и то же дерево выражений. (Таким образом, код в двух файлах будет эквивалентен, даже если они имеют разное форматирование, дополнительные пустые строки и пробелы и т. Д., Если они анализируют один и тот же объект.)

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

Вот демонстрация функции в действии:

# 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
3 голосов
/ 28 февраля 2012

Да, вы можете.Но они могут быть недостаточно гибкими для ваших нужд.program.1 и program.2 должны быть точно одинаковыми, с одинаковым кодом в тех же строках и т. Д. Смещения не допускаются.@ Джек Мани упоминал diff в комментариях выше.Это обеспечивает большую гибкость в идентичных строках, возможно, смещаясь на 1 или более строк.Обратите внимание, что он имеет в виду стандартную утилиту diff, а не функцию R diff().

Причина, по которой эти два значения должны быть в точности равны, заключается в том, что readLines() читает строки файлов как вектор символов(строки):

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

При использовании identical() и all.equal() они будут сравнивать элемент 1 из program.1 с элементом 1 из program.2 и т. д. для всех элементов (строк).Даже если код был идентичен, но содержал дополнительный возврат каретки, скажем, и identical(), и all.equal() вернут FALSE, поскольку элементы двух символьных векторов не будут равны в любом смысле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...