R中是否有R对象的本机对象id或指针值?

R中是否有R对象的本机对象id或指针值?,r,R,在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,] id您可以使用.In

在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,]

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

您可以使用
.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
函数可能会修改其参数,因为它会查看您不应该看到的内容。
地址
检查
和pryr包中的
对象大小
在这里可能很有用

library(pryr)

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

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

pryr软件包中的
地址
检查
对象大小
在这里很有用

library(pryr)

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

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

除非您使用的是显式处理R的内部构件(如data.table)的包,否则您永远不必担心这件事,这就是使用函数式语言的好处,除非您使用的是显式处理R的内部构件(如data.table)的包,你永远不必担心这个问题,这就是使用函数式语言的美妙之处