对于R对象,R中是否存在本机对象id或指针值?

问题描述 投票:1回答:2

当我在R中调试代码时,我希望能够快速检查我的变量指向的是一个与我想象的不同的对象(或同一个对象)。

在其他语言中,我可以检查“指针值”或“对象ID” - 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. 两个对象的成对比较
r
2个回答
4
投票

pryr包中的addressinspectobject_size在这里很有用。

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>

3
投票

您可以使用.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函数可能会修改其参数,因为它会查看您不应该看到的内容。

© www.soinside.com 2019 - 2024. All rights reserved.