2015-04-25 13 views
7

Posso accedere all'oggetto data.table creato nella sessione R corrente tramite il suo indirizzo di memoria o puntatore?Oggetto di accesso tramite indirizzo/puntatore

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

supponiamo per un momento si potrebbe - come lo useresti? – eddi

+0

@eddi Voglio combinare con il mio attributo 'read.only' per data.table ed essere in grado di interrogare nuovamente qualsiasi oggetto data.table da qualsiasi ambiente nella mia sessione semplicemente mantenendo * address/pointer * a dati di sola lettura .tavolo. Principalmente per uso interattivo. – jangorecki

risposta

3

Questo è un po 'un modo stupido di farlo (rispetto a come è possibile lanciare i puntatori per esempio in C++), ma si poteva fare:

# 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

Il modo più semplice di come potrebbe essere fatto, un po 'sciocco, ma dovrebbe funzionare. Grazie per la risposta. Ho bisogno di un po 'di tempo per testare i miei casi (ambienti di pacchetti con ambienti child in essi), e successivamente ho avuto accesso da GlobalEnv. Sto ancora cercando una soluzione diritta senza scansionare tutta la sessione R. – jangorecki