2015-08-28 58 views
3

我有两个功能,fg,它们具有相同的定义:在R中,我如何测试两个函数具有相同的定义?

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 
+5

你可以试试'all.equal'(发现在阅读'在看,也有一部分identical'?) – Tensibai

+0

是的,作品。谢谢。 – sdgfsdh

+0

函数不仅仅包含一个主体。除了文字之外,连身体都有其他的东西。如果只想比较正文中的文本,请尝试'same(as.character(body(g)),as.character(body(f)))' – user20637

回答

5

长版我的评论:

报价的

?identical DOC:

请参见

all.equal有关两个对象如何不同的说明;

在all.equal文档有:

不要直接在if表达式,或者使用 IsTrue运算使用all.equal(all.equal(....)),或者如果合适的相同。

所以你不需要一个函数,你可以写isTRUE(all.equal(f,g))并完成你的任务。

1

正如Tensibai建议,您可以使用all.equal功能。由于all.equal将在对象不相等时返回字符向量,因此需要使用包装。

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 
+0

为什么不按照all.equal文档直接使用isTRUE? – Tensibai

+0

'isTRUE'只是'相同的(TRUE,x)' - 我想这两种方法都是有效的。 – sdgfsdh

+2

'identical(TRUE,x)'与'x == TRUE'不一样。用'x < - “TRUE”'尝试它们。你应该使用'TRUE'而不是'T',因为'T'可以重新定义,'TRUE'不能。 –

4

你可以deparse的功能,然后检查,如果他们是相同的:

identical(deparse(f),deparse(g)) 
[1] TRUE 
相关问题