Есть ли в R собственный объектный идентификатор или значение указателя для объектов R? - PullRequest
0 голосов
/ 20 января 2019

Когда я отлаживаю код в R, я бы хотел иметь возможность быстро проверить, является ли моя переменная объектом, отличным от того, что я думал (или тем же объектом).

На других языках я могу проверить "значение указателя" или "идентификатор объекта" - есть ли что-то похожее в R?

Например

id <- c(1, 2, 3)
fname <- c("Joe", "John", "Jane")
lname <- c("Brown", "Black", "Boss")
df <- data.frame(id, fname, lname) 
df2 <- df[-2,]

Теперь df и df2 являются отдельными объектами.

Есть ли быстрый способ проверить "идентичность", которая не включает:

  1. отслеживая код, который их создал
  2. значение проверки
  3. попарное сравнение двух объектов

Ответы [ 2 ]

0 голосов
/ 20 января 2019

address, inspect и object_size в пакете pryr могут быть полезны здесь.

library(pryr)

address(df)
## [1] "0x7e0b688"

inspect(df)
## <VECSXP 0x7e0b688>
##   <REALSXP 0x7e0d028>
##   <INTSXP 0x96e7278>
## ...snip...

Например, пространство, занимаемое L1 плюс пространство, занимаемое L2 больше, чем пространство, занимаемое ими обоими, так ясно, что происходит некоторое разделение.Если мы проверим их, мы увидим, что компоненты L2 все еще хранятся в L1.

L1 <- list(1:2, 3:4, 5:6)
L2 <- L1[-2]

object_size(L1)
## 248 B
object_size(L2)
## 176 B
object_size(L1, L2)
## 312 B

inspect(L1)
## <VECSXP 0x88622a8>
##   <INTSXP 0x90ba950>
##   <INTSXP 0x90ba870>
##   <INTSXP 0x90ba790>

inspect(L2)
## <VECSXP 0x971dbf8>
##   <INTSXP 0x90ba950>
##   <INTSXP 0x90ba790>
0 голосов
/ 20 января 2019

Вы можете использовать .Internal(inspect(x)), чтобы увидеть информацию о том, что находится в x. Он включает в себя фактический указатель на x среди множества других вещей. Например, после вашего примера кода я вижу

> .Internal(inspect(df))
@7fa48059fe68 19 VECSXP g0c3 [OBJ,NAM(3),ATT] (len=3, tl=0)
  @7fa483d1ba58 14 REALSXP g0c3 [NAM(3)] (len=3, tl=0) 1,2,3
  @7fa4805a0ea8 16 STRSXP g0c3 [NAM(3)] (len=3, tl=0)
    @7fa4829d5898 09 CHARSXP g0c1 [gp=0x60] [ASCII] [cached] "Joe"
    @7fa4829d5828 09 CHARSXP g0c1 [gp=0x60] [ASCII] [cached] "John"
    @7fa4829d57b8 09 CHARSXP g0c1 [gp=0x60,ATT] [ASCII] [cached] "Jane"
  @7fa4805a0e08 16 STRSXP g0c3 [NAM(3)] (len=3, tl=0)
    @7fa4829d5588 09 CHARSXP g0c1 [gp=0x60] [ASCII] [cached] "Brown"
    @7fa4829d5518 09 CHARSXP g0c1 [gp=0x60] [ASCII] [cached] "Black"
    @7fa4829d54a8 09 CHARSXP g0c1 [gp=0x60] [ASCII] [cached] "Boss"
ATTRIB:
  @7fa4869050d0 02 LISTSXP g0c0 [] 
    TAG: @7fa47b0c2700 01 SYMSXP g1c0 [MARK,NAM(3),LCK,gp=0x4000] "names" (has value)
    @7fa48059fd78 16 STRSXP g0c3 [NAM(3)] (len=3, tl=0)
      @7fa47e05d668 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "id"
      @7fa47e3d08a0 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "fname"
      @7fa4829d55f8 09 CHARSXP g0c1 [gp=0x61] [ASCII] [cached] "lname"
    TAG: @7fa47b0c2bd0 01 SYMSXP g1c0 [MARK,NAM(3),LCK,gp=0x4000] "class" (has value)
    @7fa47bc3e440 16 STRSXP g1c1 [MARK,NAM(3)] (len=1, tl=0)
      @7fa47b1b6308 09 CHARSXP g1c2 [MARK,gp=0x61,ATT] [ASCII] [cached] "data.frame"
    TAG: @7fa47b0c24d0 01 SYMSXP g1c0 [MARK,NAM(3),LCK,gp=0x4000] "row.names" (has value)
    @7fa483ba7f78 13 INTSXP g0c1 [NAM(3)] (len=2, tl=0) -2147483648,-3

поэтому указатель на df равен @7fa48059fe68. Если вам нужен только указатель, вы можете извлечь его:

getPointer <- function(x) { 
  lines <- capture.output(.Internal(inspect(x)))
  sub(" .*", "", lines[1])
}

, а затем

> getPointer(df)
[1] "@7fa48059fe68"

Имейте в виду, что функция getPointer может изменить свой аргумент, поскольку она смотрит на вещи, которые вы не должны видеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...