الفرق: زر "ترجمة PDF" في RStudio مقابل knit() و knit2pdf()



knitr (1)

بادئ ذي بدء ، أعتقد أن هذا السؤال أسهل في الإجابة إذا قصرت النطاق على زر "ترجمة PDF" ، لأن زر "Knit HTML" هو قصة مختلفة. "Compile PDF" مخصص فقط لمستندات Rnw (R + LaTeX ، أو فكر في Sweave).

سأجيب على سؤالك بعد النقاط الثلاث التي اقترحتها:

  1. يقوم RStudio حاليًا دائمًا بتشغيل جلسة R جديدة لتجميع مستندات Rnw ، ثم يقوم أولاً بتغيير دليل العمل إلى دليل ملف Rnw. يمكنك تخيل العملية كبرنامج نصي مثل هذا:

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

    لاحظ أن حزمة knitr متصلة دائمًا ، وقد تكون pdflatex من محركات LaTeX الأخرى (اعتمادًا على تكوينات RStudio لمستندات Sweave ، على سبيل المثال ، 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') ، وفي هذه الحالة لا يتم تغيير دليل العمل تلقائيًا ، ويتم تنفيذ كل شيء في جلسة R الحالية (في globalenv() افتراضيًا ).

  2. نظرًا لأن وثيقة Rnw يتم تصنيفها دائمًا في جلسة R جديدة ، فلن تستخدم أي كائنات في جلسة R الحالية. هذا من الصعب النسخ المتماثل فقط من خلال وسيطة knitr::knit() لـ knitr::knit() في جلسة R الحالية. على وجه الخصوص ، لا يمكنك استخدام knitr::knit(envir = new.env()) لأنه على الرغم من أن new.env() هي بيئة جديدة ، إلا أنها تحتوي على بيئة أصل globalenv() ، والتي عادة ما تكون globalenv() . لا يمكنك استخدام knitr::knit(envir = emptyenv()) ، أيضًا ، لأنها "نظيفة جدًا" ، knitr::knit(envir = emptyenv()) مشكلة مع الكائنات حتى في الحزمة R الأساسية . الطريقة الوحيدة الموثوقة لتكرار ما يفعله زر "ترجمة PDF" هي ما قلته في 1: system2("Rscript", c("-e", shQuote("library(knitr); knit('your.Rnw')")) ، وفي هذه الحالة ، يقوم knit() باستخدام globalenv() لجلسة R جديدة.

  3. لست متأكدًا تمامًا بشأن ما يفعله RStudio لخيار repos . ربما يقوم تلقائيًا بتعيين هذا الخيار خلف الكواليس إذا لم يتم تعيينه. أعتقد أن هذه قضية بسيطة نسبيًا. يمكنك ضبطه في ملفك .Rprofile . وأعتقد أن RStudio يجب أن يحترم إعداد مرآة CRAN.

لطالما سأل المستخدمون عن سبب عدم تجميع وثيقة Rnw (أو مستندات R Markdown) في الجلسة R الحالية. بالنسبة لنا ، يتعلق الأمر أساسًا بأي من العواقب التالية الأكثر إثارة للدهشة أو غير المرغوب فيها:

  1. إذا قمنا بربط وثيقة في جلسة R الحالية ، فليس هناك ما يضمن إمكانية إعادة إنتاج نتائجك في جلسة R أخرى (على سبيل المثال ، في المرة التالية التي تفتح فيها RStudio ، أو يفتح المتعاونون لديك RStudio على أجهزة الكمبيوتر الخاصة بهم).
  2. إذا قمنا بربط وثيقة في جلسة R جديدة ، يمكن أن يفاجأ المستخدمون بعدم العثور على الكائنات (وعندما يكتبون أسماء الكائنات في وحدة التحكم R ، يمكنهم رؤيتها). قد يكون هذا الأمر مفاجئًا ، لكنه أيضًا تذكير جيد ومبكر بأن وثيقتك ربما لن تعمل في المرة القادمة.

لتلخيص ذلك ، أعتقد:

  • الحياكة في جلسة R جديدة أفضل لإعادة الإنتاج ؛

  • يكون الحياكة في جلسة R الحالية أكثر ملاءمة في بعض الأحيان (على سبيل المثال ، يمكنك المحاكاة مع كائنات R مختلفة مؤقتة في الجلسة الحالية). في بعض الأحيان ، يتعين عليك أيضًا ربط جلسة R الحالية ، خاصةً عند إنشاء تقارير PDF بطريقة برمجية ، على سبيل المثال ، يمكنك استخدام حلقة (من أجل) لإنشاء سلسلة من التقارير. لا توجد طريقة لتحقيق ذلك فقط من خلال زر "ترجمة ملف PDF" (يكون الزر في الغالب فقط لمستند Rnw واحد).

راجع للشغل ، أعتقد أن ما قلته أعلاه يمكن أن ينطبق أيضًا على أزرار Knit أو Knit HTML ، ولكن الوظيفة الأساسية هي rmarkdown::render() بدلاً من knitr::knit() .

TL، DR

ما هي الآثار الجانبية (ربما غير المرغوب فيها) لاستخدام knit() / knit2pdf() بدلاً من زر "ترجمة PDF" 1 في RStudio؟

التحفيز

يبدو أن معظم مستخدمي knitr بكتابة مستنداتهم في RStudio وتجميع المستندات باستخدام زر "Compile PDF" / "Knit HTML". يعمل هذا بسلاسة معظم الوقت ، ولكن هناك مرة واحدة متطلبات خاصة لا يمكن تحقيقها باستخدام زر التحويل البرمجي. في هذه الحالات ، يكون الحل عادةً استدعاء knit() / knit2pdf() / rmarkdown::render() (أو وظائف مشابهة) مباشرة.

بعض الأمثلة:

إن استخدام knit2pdf() بدلاً من زر "ترجمة PDF" عادة ما يوفر حلاً بسيطًا لهذه الأسئلة. ومع ذلك ، يأتي هذا بثمن: هناك اختلاف أساسي في أن "Compile PDF" يعالج المستند في عملية وبيئة منفصلة بينما knit2pdf() والأصدقاء لا يفعلون ذلك.

هذا له آثار والمشكلة هي أنه ليس كل هذه الآثار واضحة. خذ حقيقة أن knit() تستخدم كائنات من البيئة العالمية (في حين أن "Compile PDF" لا يستخدم) كمثال. قد يكون هذا واضحًا والسلوك المطلوب في حالات مثل المثال الثاني أعلاه ، ولكنه نتيجة غير متوقعة عند استخدام knit() للتغلب على المشكلات كما في المثال 1 و 3.

علاوة على ذلك ، هناك اختلافات أكثر دقة:

السؤال والهدف

كلما قرأت / كتبت النصيحة لاستخدام knit2pdf() بدلاً من "ترجمة ملف PDF" ، أعتقد أنه "صحيح ، لكن يجب على المستخدم فهم العواقب ..." .

لذلك ، فإن السؤال هنا هو:

ما هي الآثار الجانبية (ربما غير المرغوب فيها) لاستخدام knit() / knit2pdf() بدلاً من زر "ترجمة PDF" في RStudio؟

إذا كان هناك إجابة شاملة (ويكي مجتمع؟) على هذا السؤال ، فيمكن ربطها في الإجابات المستقبلية التي تشير إلى استخدام knit2pdf() .

أسئلة ذات صلة

هناك العشرات من الأسئلة ذات الصلة لهذا واحد. ومع ذلك ، فإنهم يقترحون رمزًا فقط (أكثر أو أقل) لإعادة إنتاج سلوك زر RStudio أو يشرحون ما يحدث "بشكل أساسي" دون ذكر المزالق المحتملة. البعض الآخر يشبه كونه أسئلة متشابهة للغاية ولكن يتحول إلى حالة خاصة جدًا. بعض الأمثلة:

عن الجواب

أعتقد أن هذا السؤال أثار العديد من القضايا التي يجب أن تكون جزءًا من الإجابة. ومع ذلك ، قد يكون هناك العديد من الجوانب الأخرى التي لا أعرف عنها ، وهذا هو السبب في أنني أحجم عن الإجابة عن هذا السؤال ذاتيًا (على الرغم من أنني قد أجرب ذلك إذا لم يرد أحد)

ربما ، يجب أن تغطي الإجابة ثلاث نقاط رئيسية:

  • الجلسة الجديدة في مقابل الجلسة الحالية (الخيارات العامة ، دليل العمل ، الحزم المحملة ، ...).
  • نتيجة النقطة الأولى: حقيقة أن knit() تستخدم كائنات من بيئة الاتصال (افتراضي: envir = parent.frame() ) وآثارها على التكاثر. حاولت معالجة مشكلة منع knit() من استخدام كائنات من خارج المستند في هذه الإجابة (النقطة الثانية).
  • الأشياء RStudio يفعل سرا ...
    • ... عند بدء جلسة تفاعلية ( example ) -> غير متوفر عند الضغط على "ترجمة ملف PDF"
    • ... عند الضغط على "ترجمة ملف PDF" (أي شيء خاص إلى جانب الجلسة الجديدة مع تعيين دليل العمل على الملف المعالج؟)

لست متأكدًا من المنظور الصحيح لهذه القضية. أعتقد أن كليهما ، "ما يحدث عندما تضغط على" Compile PDF + + Implications "وكذلك" ما يحدث عندما أستخدم knit() + effects "هو طريقة جيدة لمعالجة السؤال.

1 ينطبق الشيء نفسه على زر "Knit HTML" عند كتابة مستندات RMD.





knitr