通过其内存地址获取对象

时间:2014-02-23 07:57:25

标签: r memory

我正试图找到在R中制作链接列表的方法。

我发现tracemem()返回一个对象的内存地址,所以有什么方法可以通过它的内存地址找到一个对象吗?

2 个答案:

答案 0 :(得分:6)

这不是这样做的方法。如果您想要引用,请使用引用类或环境。像这样:

首先,我将把三个对象放在我的链表中:

> e1=new.env()
> e2=new.env()
> e3=new.env()

使用数据项和指向列表中下一个的指针进行初始化

> with(e1,{data=99;nextElem=e2})
> with(e2,{data=100;nextElem=e3})
> with(e3,{data=1011;nextElem=NA})

现在给定环境的函数返回链表中的下一个:

> nextElem = function(e){with(e,nextElem)}

让我们从一些环境e开始:

> e=e1
> with(e,data)
[1] 99

获取列表中下一项的值:

> with(nextElem(e),data)
[1] 100

只是为了证明事情正在通过引用来完成,让我们改变e2:

> with(e2,{data=555})

并且e中的下一项也发生了变化:

> with(nextElem(e),data)
[1] 555

参考类应该使它更清洁,但需要一些计划。

试图通过内存位置获取R对象是行不通的。

答案 1 :(得分:0)

由于我找到了一种简单的方法,因此我将其张贴在这里:

这可以用来获取地址和对象的列表,也可以通过内存地址来操纵它以获取对象

oo <- ls(envir=.GlobalEnv)
ad <- lapply(oo, function(.x) do.call(pryr::address,list(rlang::sym(.x))) ) 
setNames(ad, oo)

使用一些tidyverse,您可以得到一张漂亮的桌子:

oo <- ls(envir=.GlobalEnv)
purrr::map_chr(oo, ~ do.call(pryr::address,list(rlang::sym(.x))) ) %>%
    setNames(oo) %>%
    tibble::enframe()