【问题标题】:Access object by address / pointer通过地址/指针访问对象
【发布时间】:2015-04-25 21:30:40
【问题描述】:

我可以通过内存地址或指针访问在当前 R 会话中创建的 data.table 对象吗?

library(data.table)

DT <- data.table(a = 1:10, b = letters[1:10])
address(DT)
# [1] "0x6bf9b90"
attr(DT,".internal.selfref",TRUE)
# <pointer: 0x2655cc8>

【问题讨论】:

  • 让我们假设一下你可以 - 你将如何使用它?
  • @eddi 我想与我的 read.only 属性结合使用 data.table 并能够通过维护 address / 从我的会话中的任何环境重新查询任何 data.table 对象指向只读 data.table 的指针。主要用于交互使用。

标签: r data.table


【解决方案1】:

这是一种愚蠢的做法(与在例如 C++ 中如何转换指针相比),但你可以这样做:

# recursively iterate over environments
find.by.address = function(addr, env = .GlobalEnv) {
  idx = which(sapply(ls(env), function(x) address(get(x, env = env))) == addr)
  if (length(idx) != 0)
    return (get(ls(env)[idx], env = env))

  # didn't find it, let's iterate over the other environments
  idx = which(sapply(ls(env), function(x) is.environment(get(x, env = env))))
  for (i in idx) {
    res = find.by.address(addr, get(ls(env)[i], env = env))
    if (res != "couldn't find it") return (res)
  }

  return ("couldn't find it")
}

DT = data.table(a = 1)
e = new.env()
e$DT = data.table(b = 2)
e$f = new.env()
e$f$DT = data.table(c = 2)

find.by.address(address(DT))
#   a
#1: 1
find.by.address(address(e$DT))
#   b
#1: 2
find.by.address(address(e$f$DT))
#   c
#1: 2

【讨论】:

  • 最基本的实现方式,有点傻,但应该可以。感谢你的回答。我需要一些时间来测试我的案例(包含子环境的包环境),然后从 GlobalEnv 访问。仍在寻找不扫描所有 R 会话的直接解决方案。
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2015-06-17
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多