2015-04-25 145 views
7

我可以通過內存地址或指針訪問在當前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> 
+1

讓我們假設一個時刻,你可以 - 你會如何使用它? – eddi

+0

@eddi我想結合data.table中的'read.only'屬性,並且能夠通過將* address/pointer *維護到只讀數據從我的會話中的任何環境重新查詢任何data.table對象。表。主要用於交互式使用。 – jangorecki

回答

3

這是有些做(相比於如何在如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 
+0

如何做到最基本的方式,有點愚蠢,但應該工作。感謝你的回答。我需要一些時間來測試我的案例(其中包含兒童環境的包環境),然後從GlobalEnv進行訪問。仍然在尋找一個沒有掃描所有R會話的直接解決方案。 – jangorecki