在 R 中,如何测试两个函数具有相同的定义?
In R, how do I test that two functions have the same definition?
我有两个函数,f
和 g
,它们具有相同的定义:
f <- function(x) { x + 1 }
g <- function(x) { x + 1 }
但是,identical
函数认为它们不同:
identical(f, g)
FALSE
我猜这是因为它们在内存中占据了不同的区域; identical(f, f)
给出 TRUE
。
我只对测试具有相同定义的函数感兴趣;我可以使用其他功能吗?
行为应该是:
sameDefinition(f, f)
TRUE
sameDefinition(f, g)
TRUE
sameDefinition(f, function(x) { x + 1 })
TRUE
sameDefinition(f, function(x) { x + 3 })
FALSE
# Equivalent, but different definitions
sameDefinition(f, function(x) { x + 2 - 1 })
FALSE
根据腾思白的建议,可以使用all.equal
功能。需要包装器,因为当对象不相等时 all.equal
将 return 一个字符向量。
sameDefinition <- function(x, y) {
stopifnot(is.function(x), "x must be a function")
stopifnot(is.function(y), "y must be a function")
identical(all.equal(x, y), TRUE)
}
示例:
sameDefinition(f, g)
TRUE
sameDefinition(f, function(x) { x + 2 - 1 })
FALSE
我的评论长版:
?identical
文档的引述:
See Also
all.equal
for descriptions of how two objects differ;
在 all.equal 文档中有:
Do not use all.equal directly in if expressions—either use
isTRUE(all.equal(....)) or identical if appropriate.
所以你真的不需要一个函数,你可以写 isTRUE(all.equal(f,g))
并完成你的任务。
您可以 deparse
函数,然后检查它们是否相同:
identical(deparse(f),deparse(g))
[1] TRUE
我有两个函数,f
和 g
,它们具有相同的定义:
f <- function(x) { x + 1 }
g <- function(x) { x + 1 }
但是,identical
函数认为它们不同:
identical(f, g)
FALSE
我猜这是因为它们在内存中占据了不同的区域; identical(f, f)
给出 TRUE
。
我只对测试具有相同定义的函数感兴趣;我可以使用其他功能吗?
行为应该是:
sameDefinition(f, f)
TRUE
sameDefinition(f, g)
TRUE
sameDefinition(f, function(x) { x + 1 })
TRUE
sameDefinition(f, function(x) { x + 3 })
FALSE
# Equivalent, but different definitions
sameDefinition(f, function(x) { x + 2 - 1 })
FALSE
根据腾思白的建议,可以使用all.equal
功能。需要包装器,因为当对象不相等时 all.equal
将 return 一个字符向量。
sameDefinition <- function(x, y) {
stopifnot(is.function(x), "x must be a function")
stopifnot(is.function(y), "y must be a function")
identical(all.equal(x, y), TRUE)
}
示例:
sameDefinition(f, g)
TRUE
sameDefinition(f, function(x) { x + 2 - 1 })
FALSE
我的评论长版:
?identical
文档的引述:
See Also
all.equal
for descriptions of how two objects differ;
在 all.equal 文档中有:
Do not use all.equal directly in if expressions—either use isTRUE(all.equal(....)) or identical if appropriate.
所以你真的不需要一个函数,你可以写 isTRUE(all.equal(f,g))
并完成你的任务。
您可以 deparse
函数,然后检查它们是否相同:
identical(deparse(f),deparse(g))
[1] TRUE