【问题标题】:Get object by its memory address通过内存地址获取对象
【发布时间】:2014-02-23 07:57:24
【问题描述】:

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

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

【问题讨论】:

    标签: r memory


    【解决方案1】:

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

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

    > 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 对象是行不通的。

    【讨论】:

    • A pairlist 是一个链表,但在用户级别可能没有很多函数可以操作它们。
    【解决方案2】:

    由于我找到了一种简单的方法,所以我在这里发布:

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

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      相关资源
      最近更新 更多