检查2个R程序是否相同

时间:2012-02-27 23:05:35

标签: r

最近我了解到我可以使用identicalall.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年3月编辑从这里开始 #

以下是一个小示例程序,当FALSEidentical返回all.equal时,Josh的函数返回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 个答案:

答案 0 :(得分:8)

这是一个可能稍微有用的函数,因为它测试两个文件是否解析为同一个表达式树。 (因此,即使它们具有不同的格式,附加的空行和空格等,它们也会在两个文件中找到相同的代码,只要它们解析为同一个对象。)

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

答案 1 :(得分:3)

是的,你可以。但它们可能不够灵活,无法满足您的需求。 program.1program.2必须完全相同,在相同的行上使用相同的代码等。不允许偏移。 @Jack Maney在上面的评论中提到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()时,他们会将program.1的元素1与program.2的元素1进行比较,依此类推所有元素(行)。即使代码相同但包含额外的回车符,identical()all.equal()都将返回FALSE,因为两个字符向量的元素在任何意义上都不相等。 / p>