2012-01-08 22 views
8

एकाधिक पुस्तकालयों में कोई पैकेज स्थापित होने पर क्या होना चाहिए? उदाहरण के लिए, डेबियन/उबंटू में एपीटी-प्राप्त के माध्यम से डेबियनकृत पैकेज स्थापित कर सकते हैं, और उसके बाद सीआरएएन से उसी पैकेज का एक और हालिया संस्करण भी स्थापित कर सकते हैं। लाइब्रेरी() का उपयोग करते समय, सबसे हालिया पैकेज लोड हो जाएगा, या यह .libPaths() के क्रम पर निर्भर करता है?एकाधिक पुस्तकालयों में एक ही आर पैकेज

उत्तर

5

जैसा कि पहले ही दूसरों के द्वारा कहा गया है, .libPaths() खोज क्रम ऐसा मामला है जिस कारण है कि हम यह इस तरह के स्थानीय संकुल पहले की खोज कर रहे हैं distro संस्करण, विशेष रूप से डेबियन स्थिर या उबंटू विज्ञप्ति कि अद्यतन नहीं कर रहे हैं के साथ के रूप में, और अधिक बड़े होने की संभावना है कि सेट ।

स्थापित फ़ाइल /etc/R/Renviron में इस आशय का एक टिप्पणी है:

# edd Apr 2003 Allow local install in /usr/local, also add a directory for 
#    Debian packaged CRAN packages, and finally the default dir 
# edd Jul 2007 Now use R_LIBS_SITE, not R_LIBS 
R_LIBS_SITE=${R_LIBS_SITE-'/usr/local/lib/R/site-library:/usr/lib/R/site-library:/usr/lib/R/library'} 

तो R_LIBS_SITE के एक उपयोगकर्ता द्वारा सेट की मूल्य पूर्वता मिलेगा, और यहाँ दिखाया गया है मूल्य प्रयोग किया जाता है।

+1

+1। –

5

मेरी समझ यह है कि यह .libPaths() के क्रम पर निर्भर करेगा। इस से library

if (!missing(package)) { 
     if (is.null(lib.loc)) 
      lib.loc <- .libPaths() 
     lib.loc <- lib.loc[file.info(lib.loc)$isdir %in% TRUE] 
    # >>>> snipped code 
     newpackage <- is.na(match(pkgname, search())) 
     if (newpackage) { 
      pkgpath <- find.package(package, lib.loc, quiet = TRUE, 
       verbose = verbose) 
      if (length(pkgpath) == 0L) { 
      # snipped 

कोड है और इस के लिए find.package

Details 

find.package returns path to the locations where the given packages are found. 
If lib.loc is NULL, then attached packages are searched before the libraries. 
If a package is found more than once, the first match is used. 

मदद पृष्ठ से है और अगर वहाँ एक से अधिक उदाहरण हैं, तो वहाँ एक चेतावनी find.package की मेरी पढ़ने के आधार पर किया जाना चाहिए कोड (जब तक आप सेट "वर्बोज़" गलत):

if (length(paths) > 1L) { 
      paths <- paths[1L] 
      if (verbose) 
       warning(gettextf("package %s found more than once,\n 
           using the one found in %s", 
        sQuote(pkg), sQuote(paths)), domain = NA) 
0

आप उपयोग कर संकुल स्थापित कर लेते हैं apt-get, आप sudo उपयोगकर्ता, इसलिए librari हो जाएगा es सिस्टम-व्यापी स्थान (आमतौर पर/usr/lib/R) में स्थापित होगा।

जब आप सीआरएएन का उपयोग करते हैं तो आप सूडो या सामान्य उपयोगकर्ता भी हो सकते हैं। पहले मामले में पैकेज सिस्टम-व्यापी स्थापित करेंगे (एपीटी-गेट का उपयोग करके ओवर-राइटिंग फाइलें इंस्टॉल की गई हैं); दूसरे मामले में, पैकेज उपयोगकर्ता के $ HOME/R पर स्थापित होंगे।

जहां/usr/lib/R और $ HOME/R दोनों में कोई पैकेज मौजूद है, .libPaths() में पहला स्थान लोड होने पर उपयोग किया जाएगा (जो आमतौर पर $ HOME/R है)।

संपादित करें: डिर्क ने इंगित किया है, सिस्टम-व्यापी इंस्टॉल/usr/local/lib/r /, not/usr/lib/R पर जाना चाहिए। हालांकि, मेरा सामान्य बिंदु खड़ा है: स्थापना स्थान उपयोगकर्ता अनुमतियों पर निर्भर करता है और लोडिंग का क्रम .libPaths() पर निर्भर करता है।

+1

यह सही नहीं है, कम से कम नहीं, अगर आप उबंटू या डेबियन_ के लिए पूर्व-निर्मित आर बाइनरी का उपयोग करते हैं, तो हम 'R_LIBS' et al सेट करते हैं ताकि स्थानीय इंस्टॉल हमेशा '/ usr/local/lib/r /' पर जाएं। 2003 से या तो हजारों उपयोगकर्ताओं के लिए यह योजना काम कर चुकी है। –

+0

तो अगर मैं update.packages() चलाता हूं तो क्या होता है? क्या यह '/ usr/lib/R' के अंदर फ़ाइलों को ओवरराइट करने का प्रयास करेगा, या यह'/usr/local/lib/r' पर प्रतियां इंस्टॉल करेगा? – Jeroen

+0

डिर्क आप स्पष्ट कर सकते हैं: मेरे सिस्टम पर, मैं दोनों/usr/lib/R/साइट-लाइब्रेरी/और/usr/local/lib/r/साइट-लाइब्रेरी/में दोनों पैकेज देखता हूं। ऐसा लगता है, उदाहरण के लिए, आर-क्रैन-राजवा ने/usr/lib/r/साइट-लाइब्रेरी/आरजेएवी में स्थापित किया है। – neilfws

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