2015-08-28 60 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 
相關問題