2012-04-01 12 views
17

मैं पूछना चाहूंगा कि एक बार पर्यावरण के सभी वस्तुओं को प्रतिलिपि बनाना/स्थानांतरित करना संभव है या नहीं। उदाहरण के लिए:आर: प्रति माह एक पर्यावरण को कॉपी/स्थानांतरित करें

f1 <- function() { 
    print(v1) 
    print(v2) 
} 

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 

    # environment(f1)$v1 <- v1   # It works 
    # environment(f1)$v2 <- v2   # It works 

    environment(f1) <- environment(f2) # It does not work 
} 

f2() 
f1() 

TNX, अग्रिम में

उत्तर

22

वहाँ कम से कम 3 अलग अलग चीजें आप कर सकते हैं होने लगते हैं एक वातावरण f1 अंदर की ओर इशारा करते होना करने के लिए प्राप्त करने होंगे:

  1. एक (एक सटीक डुप्लिकेट बनाने) पर्यावरण
  2. कॉपी एक और पर्यावरण
  3. शेयर एक ही पर्यावरण के लिए एक माहौल की सामग्री क्लोन

क्लोन करने के लिए:

# Make the source env 
e1 <- new.env() 
e1$foo <- 1 
e1$.bar <- 2 # a hidden name 
ls(e1) # only shows "foo" 

# This will clone e1 
e2 <- as.environment(as.list(e1, all.names=TRUE)) 

# Check it... 
identical(e1, e2) # FALSE 
e2$foo 
e2$.bar 

सामग्री की प्रतिलिपि के लिए, आपको @gsk क्या दिखाया कर सकते हैं। लेकिन फिर, all.names झंडा उपयोगी है:

# e1 is source env, e2 is dest env 
for(n in ls(e1, all.names=TRUE)) assign(n, get(n, e1), e2) 

पर्यावरण साझा करने के लिए @koshke क्या किया है। यह शायद अक्सर अधिक उपयोगी है। परिणाम एक ही है एक स्थानीय समारोह बनाने के रूप में यदि:

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 

    # This local function has access to v1 and v2 
    flocal <- function() { 
    print(v1) 
    print(v2) 
    } 

    return(flocal) 
} 

f1 <- f2() 
f1() # prints 1 and 2 
+0

यह एक पूरा उत्तर है –

9

इस प्रयास करें:

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 
    environment(f1) <<- environment() 
} 
+0

आप सही हैं, बहुत बहुत धन्यवाद! –

+0

+1 - अच्छा एक ... – Tommy

5

आपके द्वारा सौंपे इस्तेमाल कर सकते हैं:

f1 <- function() { 
    print(v1) 
    print(v2) 
} 

f2 <- function() { 
    v1 <- 1 
    v2 <- 2 

    for(obj in c("v1","v2")) { 
    assign(obj,get(obj),envir=f1.env) 
    } 
} 

तुम बाहर सूचीबद्ध नहीं करना चाहते हैं वस्तुओं, ls() एक पर्यावरण तर्क लेता है।

और आप यह पता लगाने की कैसे f1.env :-)

+0

यह एक बहुत अच्छा जवाब है –

+0

ध्यान दें कि यह कोड केवल 'v1' और 'v2' को' exportovalEnv' में असाइन कर रहा है ... – kohske

+0

धन्यवाद! यह एक मजेदार सवाल था। @ कोहस्के का समाधान अधिक सुरुचिपूर्ण लगता है (हमेशा के रूप में!)। –

1

यह ऐसा करने के लिए:

environment(f1) <- environment(f2) # It does not work 

ओपन f1 पर्यावरण और चलाने इस करते हैं:

ls(load(f2)) 
2

मैं इस सुविधा का उपयोग वस्तुओं को कॉपी करने के लिए मेरे पैकेज में:

copyEnv <- function(from, to, names=ls(from, all.names=TRUE)) { 
    mapply(assign, names, mget(names, from), list(to), 
     SIMPLIFY = FALSE, USE.NAMES = FALSE) 
    invisible(NULL) 
} 
संबंधित मुद्दे