2017-08-15 15 views
10

के अंत में निष्पादित नहीं करता है प्रलेखन ?reg.finalizer से:reg.finalizer() एक अनुसंधान पैकेज में आर में एक अनुसंधान सत्र

अन्य बातों के साथ, यह कोड कार्यक्रम के लिए एक रास्ता चलाने के लिए प्रदान करता है .Last में हेरफेर किए बिना आर सत्र के अंत में। किसी पैकेज में उपयोग के लिए, अक्सर नामस्थान में किसी ऑब्जेक्ट पर फाइनलाइज़र सेट करना एक अच्छा विचार होता है: फिर सत्र के अंत में इसे कॉल किया जाएगा, या सत्र के दौरान किए जाने पर नामस्थान को अनलोड किए जाने के तुरंत बाद।

ऐसा लगता है कि आर 0 सत्र समाप्त होने पर कुछ कोड चलाने के लिए मैं reg.finalizer() का उपयोग कर सकता हूं, लेकिन यह मेरे लिए काम नहीं करता है। मैं https://github.com/yihui/finalizer-test पर एक न्यूनतम पैकेज, जो मूल रूप से नीचे कोड शामिल तैयार किया है:

e = new.env() 

reg.finalizer(e, function(e) { 
    message('Bye!') 
}, onexit = TRUE) 

मैं बस एक इंटरैक्टिव आर सत्र में उपरोक्त कोड चलाने के लिए और सत्र से बाहर निकलें, तो मैं संदेश Bye! देख सकते हैं, लेकिन अगर मैं उपर्युक्त पैकेज स्थापित करें (आप devtools::install_github('yihui/finalizer-test') का उपयोग कर सकते हैं), इसे आर सत्र में लोड करें, और आर सत्र छोड़ दें, मुझे संदेश नहीं दिखाई देता है। मुझे आश्चर्य है कि अंतिम मामले में इस मामले में निष्पादन क्यों नहीं किया जाता है।

Fwiw, जब मैं पैकेज स्थापित, मैं संदेश Bye! देख सकते हैं:

$ R -e "library(finalizer)" 
> library(finalizer) 
> 
> 
$ 

उत्तर

7

:

$ R CMD INSTALL . 

* installing to library ‘/Users/yihui/R’ 
* installing *source* package ‘finalizer’ ... 
** R 
** preparing package for lazy loading 
No man pages found in package ‘finalizer’ 
** help 
*** installing help indices 
Bye! 
** building package indices 
** testing if installed package can be loaded 
* DONE (finalizer) 

मैं संदेश दिखाई नहीं देता, या तो, जब मैं नीचे कमांड चलाएँ यह काम करता है अगर आप पैकेजर नाम अंतरिक्ष वातावरण में फ़ाइनलाइज़र फ़ंक्शन पंजीकृत करते हैं। आपको लगता है कि के लिए .onLoad हुक का उपयोग कर सकते हैं:

e = new.env() 

reg.finalizer(e, function(e) { 
    message('Object Bye!') 
}, onexit = TRUE) 


finalize <- function(env) { 
    print(ls(env)) 
    message("Bye from Name space Finalizer") 
} 


.onLoad <- function(libname, pkgname) { 
    parent <- parent.env(environment()) 
    print(str(parent)) 
    reg.finalizer(parent, finalize, onexit= TRUE) 
} 

वस्तु finalizer समारोह कहा जाता है नहीं है, लेकिन जब से तुम पूरे नाम स्थान वातावरण है तो आप शायद इसकी आवश्यकता नहीं है।

मैं https://github.com/mpbastos/finalizer-test पर अपने परीक्षण पैकेज का एक कांटा बनाया:

> devtools::install_git("https://github.com/mpbastos/finalizer-test") 
Downloading git repo https://github.com/mpbastos/finalizer-test 
Installing finalizer 
"C:/PROGRA~1/R/R-34~1.0/bin/x64/R" --no-site-file --no-environ --no-save \ 
    --no-restore --quiet CMD INSTALL \ 
    "C:/Users/mbastos/AppData/Local/Temp/RtmpOGymjQ/file5cf829e63957" \ 
    --library="\\sharedfs/MyDocs6/mbastos/Documents/R/win-library/3.4" \ 
    --install-tests 

* installing *source* package 'finalizer' ... 
** R 
** preparing package for lazy loading 
** help 
No man pages found in package 'finalizer' 
*** installing help indices 
** building package indices 
Object Bye! 
** testing if installed package can be loaded 
*** arch - i386 
<environment: namespace:finalizer> 
NULL 
[1] "e"  "finalize" 
Bye from Name space Finalizer 
*** arch - x64 
<environment: namespace:finalizer> 
NULL 
[1] "e"  "finalize" 
Bye from Name space Finalizer 
* DONE (finalizer) 
> library(finalizer) 
<environment: namespace:finalizer> 
NULL 
> q() 
Save workspace image? [y/n/c]: n 
[1] "e"  "finalize" 
Bye from Name space Finalizer 
+2

'.onLoad' चाल किया! धन्यवाद! –

संबंधित मुद्दे