अंतर: RStudio बनाम निट() और knit2pdf में "संकलित पीडीएफ" बटन



knitr (1)

टी एल; डॉ

knit2pdf() में "कंपाइल पीडीएफ" 1 बटन के बजाय knit2pdf() / knit2pdf() का उपयोग करने के (संभवतः अवांछित) दुष्प्रभाव क्या हैं?

प्रेरणा

knitr अधिकांश उपयोगकर्ता knitr अपने दस्तावेज़ लिखते हैं और "संकलित पीडीएफ" / "बुनना एचटीएमएल" बटन का उपयोग करके दस्तावेजों को संकलित करते हैं। यह ज्यादातर समय सुचारू रूप से काम करता है, लेकिन हर बार एक समय के बाद विशेष आवश्यकताएं होती हैं जो संकलन बटन का उपयोग करके प्राप्त नहीं की जा सकती हैं। इन मामलों में, समाधान आम तौर पर knit() / knit2pdf() / rmarkdown::render() (या इसी तरह के कार्यों) को सीधे कॉल करने के लिए है।

कुछ उदाहरण:

"कंपाइल पीडीएफ" बटन के बजाय knit2pdf() का उपयोग करके आमतौर पर इस तरह के प्रश्नों का एक सरल समाधान प्रस्तुत किया जाता है। हालाँकि, यह एक मूल्य पर आता है: एक मूलभूत अंतर है कि "कंपाइल पीडीएफ" एक अलग प्रक्रिया और वातावरण में दस्तावेज़ को संसाधित करता है जबकि knit2pdf() और दोस्तों को नहीं।

इसके निहितार्थ हैं और समस्या यह है कि इनमें से सभी निहितार्थ स्पष्ट नहीं हैं। इस तथ्य को लें कि knit() वैश्विक वातावरण से वस्तुओं का उपयोग करता है (जबकि "कंपाइल पीडीएफ" उदाहरण के रूप में नहीं है)। यह स्पष्ट हो सकता है और ऊपर दिए गए दूसरे उदाहरण जैसे मामलों में वांछित व्यवहार, लेकिन यह एक अप्रत्याशित परिणाम है जब knit() का उपयोग उदाहरण 1 और 3 जैसी समस्याओं को दूर करने के लिए किया जाता है।

इसके अलावा, अधिक सूक्ष्म अंतर हैं:

प्रश्न और यह लक्ष्य है

जब भी मैं "Compile PDF" के बजाय knit2pdf() का उपयोग करने की सलाह पढ़ता / लिखता हूँ, मुझे लगता है कि "सही है, लेकिन उपयोगकर्ता को परिणामों को समझना चाहिए ..."

इसलिए, यहाँ सवाल यह है:

knit2pdf() में "कंपाइल पीडीएफ" बटन के बजाय knit2pdf() / knit2pdf() का उपयोग करने के (संभवतः अवांछित) दुष्प्रभाव क्या हैं?

यदि इस प्रश्न का एक व्यापक (सामुदायिक विकी?) उत्तर था, तो इसे भविष्य के उत्तरों में जोड़ा जा सकता है जो knit2pdf() का उपयोग करने का सुझाव देते हैं।

संबंधित सवाल

इससे संबंधित दर्जनों सवाल हैं। हालांकि, वे या तो केवल (अधिक या कम) कोड को RStudio बटन के व्यवहार को पुन: पेश करते हैं या वे बताते हैं कि संभावित नुकसान का उल्लेख किए बिना "मूल रूप से" क्या होता है। अन्य लोग बहुत समान प्रश्नों के समान दिखते हैं, लेकिन इसका (बहुत) विशेष मामला है। कुछ उदाहरण:

उत्तर के बारे में

मुझे लगता है कि इस सवाल ने कई मुद्दों को उठाया जो एक जवाब का हिस्सा होना चाहिए। हालाँकि, ऐसे कई और पहलू हो सकते हैं जिनके बारे में मुझे नहीं पता है कि यही वजह है कि मैं इस सवाल के आत्म-उत्तर के लिए अनिच्छुक हूं (हालांकि अगर कोई जवाब नहीं देता है तो मैं कोशिश कर सकता हूं)।

शायद, एक उत्तर में तीन मुख्य बिंदु शामिल होने चाहिए:

  • नया सत्र बनाम वर्तमान सत्र मुद्दा (वैश्विक विकल्प, कार्यशील निर्देशिका, लोड किए गए पैकेज,…)।
  • पहले बिंदु का एक परिणाम: तथ्य यह है कि knit() कॉलिंग वातावरण से वस्तुओं का उपयोग करता है (डिफ़ॉल्ट: envir = parent.frame() ) और प्रतिलिपि प्रस्तुत करने envir = parent.frame() लिए निहितार्थ। मैंने इस उत्तर (दूसरी गोली बिंदु) में दस्तावेज़ के बाहर से वस्तुओं का उपयोग करने से knit() को रोकने के मुद्दे से निपटने की कोशिश की।
  • चीजें RStudio चुपके से करता है ...
    • ... इंटरेक्टिव सेशन शुरू करते समय ( example ) -> "कंपाइल पीडीएफ" को हिट करते समय उपलब्ध नहीं
    • ... जब "संकलित पीडीएफ" (नया विशेष के अलावा कुछ भी विशेष कार्यशील निर्देशिका के साथ संसाधित फ़ाइल में सेट?)

मैं इस मुद्दे पर सही दृष्टिकोण के बारे में निश्चित नहीं हूं। मुझे लगता है कि दोनों, "क्या होता है जब मैं 'कंपाइल पीडीएफ' + निहितार्थ" के साथ-साथ "क्या होता है जब मैं knit() उपयोग करता हूं knit() + निहितार्थ" सवाल से निपटने के लिए एक अच्छा तरीका है।

1 RMD दस्तावेज़ लिखते समय "निट HTML" बटन पर भी यही लागू होता है।


सबसे पहले, मुझे लगता है कि इस प्रश्न का उत्तर देना आसान है यदि आप गुंजाइश को "कंपाइल पीडीएफ" बटन पर सीमित करते हैं, क्योंकि "निट HTML" बटन एक अलग कहानी है। "कंपाइल पीडीएफ" केवल Rnw दस्तावेजों (R + LaTeX, या स्वेव के बारे में सोचें) के लिए है।

आपके द्वारा सुझाए गए तीन बिंदुओं के बाद मैं आपके प्रश्न का उत्तर दूंगा:

  1. वर्तमान में RStudio ने Rnw दस्तावेज़ों को संकलित करने के लिए हमेशा एक नया R सत्र शुरू किया है, और पहले Rn फ़ाइल की निर्देशिका में कार्यशील निर्देशिका को बदलता है। आप इस तरह से शेल स्क्रिप्ट के रूप में प्रक्रिया की कल्पना कर सकते हैं:

    cd path/to/your-Rnw-directory
    Rscript -e "library(knitr); knit('your.Rnw')"
    pdflatex your.tex

    ध्यान दें कि knitr पैकेज हमेशा संलग्न होता है, और pdflatex अन्य LaTeX इंजन हो सकता है (स्वाइव दस्तावेजों के लिए आपके RStudio कॉन्फ़िगरेशन पर निर्भर करता है, जैसे, xelatex )। यदि आप इसे अपने वर्तमान R सत्र में दोहराना चाहते हैं, तो आप R में स्क्रिप्ट को फिर से लिख सकते हैं:

    owd = setwd("path/to/your-Rnw-directory")
    system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')"))
    system2("pdflatex", "your.tex")
    setwd(owd)

    जो knitr::knit('path/to/your.Rnw') जितना आसान नहीं है knitr::knit('path/to/your.Rnw') , जिस स्थिति में कार्य निर्देशिका स्वचालित रूप से बदली नहीं जाती है, और सब कुछ मौजूदा R सेशन ( globalenv() में डिफ़ॉल्ट रूप से निष्पादित होता है। )।

  2. क्योंकि Rnw दस्तावेज़ हमेशा नए R सत्र में संकलित किया जाता है, यह आपके वर्तमान R सत्र में किसी भी ऑब्जेक्ट का उपयोग नहीं करेगा। वर्तमान आर सत्र में knitr::knit() के knitr::knit() तर्क के माध्यम से केवल इसे दोहराना कठिन है। विशेष रूप से, आप knitr::knit(envir = new.env()) उपयोग नहीं कर सकते, क्योंकि new.env() एक नया वातावरण है, इसमें एक मूल अभिभावक पर्यावरण parent.frame() , जो आमतौर पर globalenv() ; आप knitr::knit(envir = emptyenv()) उपयोग नहीं कर सकते हैं knitr::knit(envir = emptyenv()) , या तो, क्योंकि यह "बहुत साफ" है, और R बेस पैकेज में भी आपको ऑब्जेक्ट्स से परेशानी होगी। "कंपाइल पीडीएफ" बटन जो करता है उसे दोहराने का एकमात्र विश्वसनीय तरीका यह है कि मैंने 1: system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')")) , जिस स्थिति में knit() एक नए आर सत्र के globalenv() का उपयोग करता है।

  3. मैं पूरी तरह से इस बारे में निश्चित नहीं हूं कि RStudio repos विकल्प के लिए क्या करता है। शायद यह स्वचालित रूप से पर्दे के पीछे इस विकल्प को सेट करता है यदि यह सेट नहीं है। मुझे लगता है कि यह एक अपेक्षाकृत छोटा मुद्दा है। आप इसे अपने .Rprofile में सेट कर सकते हैं, और मुझे लगता है कि RStudio को आपकी CRAN मिरर सेटिंग का सम्मान करना चाहिए।

उपयोगकर्ता हमेशा से पूछते रहे हैं कि Rnw दस्तावेज़ (या R Markdown दस्तावेज़) को वर्तमान R सत्र में संकलित क्यों नहीं किया गया है। हमारे लिए, यह मूल रूप से उबलता है कि निम्नलिखित में से कौन सा परिणाम अधिक आश्चर्यजनक या अवांछित है:

  1. यदि हम वर्तमान आर सत्र में एक दस्तावेज बुनते हैं, तो इस बात की कोई गारंटी नहीं है कि आपके परिणाम दूसरे आर सत्र (जैसे, अगली बार जब आप RStudio खोलते हैं, या आपके सहयोगी अपने कंप्यूटर पर RStudio खोलते हैं) में पुन: पेश किया जा सकता है।
  2. यदि हम एक नए आर सत्र में एक दस्तावेज बुनते हैं, तो उपयोगकर्ता आश्चर्यचकित हो सकते हैं कि ऑब्जेक्ट नहीं मिले हैं (और जब वे आर कंसोल में ऑब्जेक्ट नाम टाइप करते हैं, तो वे उन्हें देख सकते हैं)। यह आश्चर्य की बात हो सकती है, लेकिन यह एक अच्छा और शुरुआती अनुस्मारक भी है कि आपका दस्तावेज़ शायद अगली बार काम नहीं करेगा।

यह योग करने के लिए, मुझे लगता है:

  • एक नए आर सत्र में बुनाई प्रजनन योग्यता के लिए बेहतर है;

  • वर्तमान आर सत्र में बुनाई कभी-कभी अधिक सुविधाजनक होती है (उदाहरण के लिए, आप वर्तमान सत्र में विभिन्न अस्थायी आर वस्तुओं के साथ बुनना करने की कोशिश करते हैं)। कभी-कभी आपको वर्तमान आर सत्र में भी बुनना पड़ता है, खासकर जब आप पीडीएफ रिपोर्ट को प्रोग्रामेटिक रूप से उत्पन्न कर रहे होते हैं, उदाहरण के लिए, आप रिपोर्ट की एक श्रृंखला उत्पन्न करने के लिए (के लिए) लूप का उपयोग करते हैं। कोई रास्ता नहीं है कि आप इसे केवल "कंपाइल पीडीएफ" बटन के माध्यम से प्राप्त कर सकते हैं (बटन ज्यादातर केवल एक आरएनडब्ल्यू दस्तावेज़ के लिए है)।

BTW, मुझे लगता है कि मैंने जो ऊपर कहा था, वह बुनना या बुनना HTML बटन पर भी लागू हो सकता है, लेकिन अंतर्निहित फ़ंक्शन rmarkdown::render() बजाय knitr::knit()





knitr