2014-11-21 8 views
5

यह magrittr पैकेज में %>% लगते हैं के लिए काम नहीं कर रहा समारोह load() लिए काम नहीं कर रहा है। मेरे प्रश्न को पुन: उत्पन्न करने के लिए यह मेरा न्यूनतम उदाहरण है।पाइप समारोह लोड()

## Create two example variables and save to tempdir() 
a <- 1 
b <- 1 

save(list = ls(), file = file.path(tempdir(), 'tmp.RData')) 

## Remove all variables and load into global environment 
# rm(list = ls()) 

load(file.path(tempdir(), 'tmp.RData')) 
ls() 
# [1] "a" "b" 

# Write the same code with pipe "%>%", but not variable is loaded 
# rm(list =ls()) 
library(magrittr) 

tempdir() %>% file.path('tmp.RData') %>% load 
ls() 
# character(0) 

मुझे समझ में नहीं आता कि पाइप load() के लिए क्यों काम नहीं कर रहा है। किसी भी सुझाव के लिए धन्यवाद।

+8

उदाहरण के लिए 'आरएम (सूची = एलएस())' शामिल करने के लिए आमतौर पर अच्छा रूप नहीं है, इसलिए लोग अनजाने में अपने कामकाजी डेटा को नष्ट नहीं करते हैं। – thelatemail

+3

@thelatemail आपके संपादन के लिए धन्यवाद। मैं आमतौर पर स्टैक ओवरफ्लो और अन्य से उदाहरण कोड का परीक्षण करने के लिए एक नया सत्र खोलता हूं। – Bangyou

+0

शायद यह स्मार्ट है। :-) – thelatemail

उत्तर

5

envirload() में तर्क globalenv() या parent.frame(3) के रूप में निर्दिष्ट करने की आवश्यकता है।

# in a fresh R session ... 
a <- 1 
b <- 1 
save(list = ls(), file = file.path(tempdir(), 'tmp.RData')) 

# in another fresh session ... 
ls() 
# character(0) 
tempdir() %>% file.path("tmp.RData") %>% load(envir = globalenv()) 
ls() 
# [1] "a" "b" 

निम्नलिखित भी काम करता है:

tempdir() %>% file.path("tmp.RData") %>% load(envir = parent.frame(3)) 

मैं क्यों की व्याख्या करने की कोशिश करेंगे। जब आप किसी भी पर्यावरण से load() पर कॉल करते हैं, तो फ़ंक्शन पैरेंट वातावरण में नई ऑब्जेक्ट्स लोड करता है।

अब, वैश्विक पर्यावरण globalenv() आपकी आर कार्यक्षेत्र है। इसलिए, यदि आप वैश्विक पर्यावरण से लोड कहते हैं (यानी वर्कस्पेस) जैसा कि आप उम्मीद करते हैं, सबकुछ काम करता है। इस कल्पना:

  • वैश्विक पर्यावरण
    • load()

हालांकि, अगर आप एक समारोह अंदर से load() फोन है, तो आप लोड और वैश्विक के बीच में एक ऐसा माहौल डाला है वातावरण। इस कल्पना:

  • वैश्विक पर्यावरण
    • समारोह
      • load()

यह वास्तव में क्या होता है जब आप मिश्रण में %>% डाल है:

  • वैश्विक पर्यावरण
    • %>%
      • load()

इस हल करने के लिए दो समाधान कर रहे हैं। या तो globalenv() पर स्पष्ट रूप से इंगित करें या parent.frame(3) का उपयोग कर वैश्विक पर्यावरण में श्रृंखला को 3 चरणों तक चलें।


नोट: इस के लिए एक issue reported on GitHub था। निश्चित नहीं है कि संकल्प क्या था, या यदि अभी तक कोई है। इस मुद्दे को सितंबर में अभी रिपोर्ट किया गया था।

इस स्पष्टीकरण में सुधार के लिए @Andrie के लिए बहुत धन्यवाद।

+0

आपके सुझाव के लिए धन्यवाद। यह वैश्विक पर्यावरण के लिए काम कर रहा है, लेकिन फ़ंक्शन में "लोड" को कॉल करते समय भी इसे ठीक करने की आवश्यकता है। – Bangyou

+0

आपके सुझाव के लिए धन्यवाद। मेरे खुदाई के लिए, पाइप वास्तव में फ़ंक्शन लोड का मूल्यांकन करती है और सभी चर को नए वातावरण में लोड करती है। लेकिन लौटाए गए मूल्य अदृश्य (दृश्यमान = गलत) हैं, इसलिए पाइप एक अदृश्य परिणाम लौटाता है (अदृश्य (परिणाम [["मान"]])। सुनिश्चित नहीं है कि इसे कैसे ठीक किया जाए। – Bangyou

+0

github की टिप्पणी में विवरण देखें: https://github.com/smbache/magrittr/issues/38 – Bangyou