2015-04-25 24 views
7

Geçerli R oturumunda oluşturulan data.table nesnesine, bellek adresi veya işaretçisiyle erişebilir miyim?Erişim nesnesine/işaretçiye göre

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

en yapabildin bir an için düşünelim - Bunu nasıl kullanırsın? – eddi

+0

@eddi data.table için 'read.only' özniteliğiyle birleştirmek istiyorum ve yalnızca salt okunur verilere * adres/işaretçi * özelliğini kullanarak herhangi bir data.table nesnesini oturumumdaki herhangi bir ortamdan yeniden sorgulayabiliyorum .table. Çoğunlukla interaktif kullanım içindir. – jangorecki

cevap

3

Bu biraz (karşılaştırıldığında Eğer örneğin C++ içinde işaretçileri döküm nasıl kadar) bunu yapmanın bir aptal yolu olmakla birlikte, yapabileceği:

# 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

Nasıl yapılabileceğini en basit yolu, biraz saçma ama işe yaramalı. Cevap için teşekkürler. Vakalarımı test etmek için biraz zamana ihtiyacım var (içlerinde ortamları olan ortamları paketler) ve daha sonra GlobalEnv'den erişilir. Hala tüm R seanslarını taramaksızın düz bir çözüm arıyorum. – jangorecki