2012-06-06 86 views
13

有沒有辦法測試兩種對象在R語言中是否相同?R對象標識

爲了清楚:我並不意味着在identical功能的意義上,這 基於像我在對象標識真正感興趣的數值或邏輯值等

某些特性進行比較的對象是相同的,例如可以使用Python語言中的is運算符進行測試。

+3

對於那些不熟悉Python,你能詳細說明你如何定義身份(或說同一性)?在嚴格意義上,對象只能與自身相同。這個測試的預期用途是什麼? – Roland

+1

你是指對象類嗎?例如'is.numeric'? – Andrie

+0

@Andrie和Roland:我的意思是主存中同一地址的意義。例如,在像Python或Java這樣的通用語言中,我可以做類似(模語法) b = new Object() c = b 在這種情況下,b和c指向相同的對象。 –

回答

22

UPDATE:一個更強大,更快地實現的address(x)(不使用.Internal(inspect(x)))加入到data.table v1.8.9。從NEWS

新函數address()返回其參數在RAM中的地址。有時在程序上用於確定值是否已被R複製。


有可能是一個更合適的方法,但這似乎工作。

address = function(x) substring(capture.output(.Internal(inspect(x)))[1],2,17) 
x = 1 
y = 1 
z = x 
identical(x,y) 
# [1] TRUE 
identical(x,z) 
# [1] TRUE 
address(x)==address(y) 
# [1] FALSE 
address(x)==address(z) 
# [1] TRUE 

您可以修改它通過改變179在32位工作。

+0

這很有趣。你知道我在哪裏可以讀到更多關於R實際創建新對象的時間以及它何時指向內存中的現有對象? – Roland

+1

@Roland Hm。我認爲這很容易搜索和找到一些鏈接,但似乎沒有。我發現的所有內容都是[R內部的第1.1.2節](http://cran.r-project.org/doc/manuals/R-ints.html#Rest-of-header)按價值錯覺實施。我傾向於嘗試使用tracemem和內部(檢查(...))來制定複製時間。這樣做導致[這篇文章到r-devel](http://r.789695.n4.nabble.com/Confused-about-NAMED-tp4103326.html),這可能會提供更多的線索。 –

+0

謝謝。 r-devel上的線程非常有趣,我相信我從中學到了一些東西,儘管它略高於我目前的編程教育水平。 :) – Roland

0

您可以使用pryr包。

例如,返回mtcars對象的內存位置:

pryr::address(mtcars) 

然後,對於變量ab,您可以檢查:

address(a) == address(b)