Вопрос по object, identity, r – R объект идентичности

14

Есть ли способ проверить, идентичны ли два объекта в языке R?

For clarity: Я не имею в виду идентичные в смыслеidentical функция, который сравнивает объекты на основе определенных свойств, таких как числовые значения или логические значения и т. д.

Я действительно заинтересован в идентификации объекта, который, например, может быть проверен с помощьюis оператор на языке Python.

Вы имеете в виду класс объекта? Напримерis.numeric? Andrie
@Andrie и Roland: я имею в виду идентичность в смысле того же адреса в основной памяти. Например, в общем языке, таком как Python или Java, я мог бы сделать что-то вроде (по модулю синтаксиса) b = new Object () c = b В этом случае b и c указывают на один и тот же объект. Sven Hager
Для тех, кто не знаком с Python, не могли бы вы рассказать, как вы определяете идентичность (или, скажем, одинаковость)? В строгом смысле объект может быть идентичен только самому себе. Каково будет предполагаемое использование этого теста? Roland
@joran: это может быть интересно для справочных классов (?getRefClass) ... ? Ben Bolker

Ваш Ответ

2   ответа
2

Вы можете использоватьpryr пакет.

Например, вернуть место в памятиmtcars объект:

pryr::address(mtcars)

Тогда для переменныхa а такжеb, ты можешь проверить:

address(a) == address(b)
24

UPDATE: Более надежная и быстрая реализацияaddress(x) (не используется.Internal(inspect(x))) был добавлен вdata.table v1.8.9, ОтНОВОСТИ :

New function address() returns the address in RAM of its argument. Sometimes useful in determining whether a value has been copied or not by R, programatically.

Вероятно, есть более аккуратный способ, но, похоже, это работает.

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

Вы можете изменить его для работы на 32-битной, изменив17 в9.

@ MatthewLundberg Хм ... Полагаю, во многих разных средах потенциально может быть много символов, привязанных к одному и тому же адресу.Possible хоть. Вы имели в виду использование? Да, но вы имеете в виду создать привязку к адресу и разыменовать его, как * p в C. Это было бы невозможно (я полагаю), потому что сборка мусора могла бы очистить этот объект в то же время.
Это интересно. Вы знаете, где я мог бы прочитать немного больше о том, когда R на самом деле создает новые объекты и когда он просто указывает на существующие объекты в памяти?
Можно ли написать обратное кaddress?
Действительно, сборщик мусора может пожинать объект между временем, когда был получен адрес, и вызванным обратным. Это может привести к сбою программы или, что еще хуже, вернуть не связанный объект. Из-за этого обратноеaddress звучит как очень плохая идея.
@Roland Хм. Я думал, что будет легко найти и найти некоторые ссылки, но, похоже, нет. Все, что я нашел, этоsection 1.1.2 of R Internals который объясняет, как реализована иллюзия вызова по значению. Я склонен экспериментировать сtracemem а также.Internal(inspect(...)) работать, когда копии сделаны. Это привело кthis post to r-devel что может дать еще несколько подсказок.

Похожие вопросы