最近我了解到我可以使用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年3月编辑从这里开始 #
以下是一个小示例程序,当FALSE
和identical
返回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"
)
答案 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.1
和program.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>