Mark উত্স ('myfile.r') like এর মতো আর মার্কডাউন ফাইল কীভাবে উত্স করবেন?


89

আমার প্রায়শই একটি প্রধান আর মার্কডাউন ফাইল বা নাইটার ল্যাটেক্স ফাইল থাকে যেখানে আমি sourceঅন্য কোনও আর ফাইল (যেমন, ডেটা প্রসেসিংয়ের জন্য)। যাইহোক, আমি ভাবছিলাম যে কিছু ক্ষেত্রে এই উত্সযুক্ত ফাইলগুলি তাদের নিজস্ব পুনরুত্পাদনযোগ্য নথি হওয়া যেমন উপকারী হবে (উদাহরণস্বরূপ, একটি আর মার্কডাউন ফাইল যাতে ডেটা প্রসেসিংয়ের জন্য কমান্ডগুলি অন্তর্ভুক্ত করে না তবে এটি একটি পুনরুত্পাদনযোগ্য নথিও সরবরাহ করে যা ডেটা প্রসেসিংয়ের সিদ্ধান্তগুলি ব্যাখ্যা করে explains )।

সুতরাং, আমি source('myfile.rmd')আমার প্রধান আর মার্কডাউন ফাইলের মতো একটি কমান্ড চাই । এটি আর কোডের ভিতরে থাকা সমস্ত আর কোডের উত্স এবং উত্স তৈরি করবে myfile.rmd। অবশ্যই, এটি একটি ত্রুটির জন্ম দেয়।

নিম্নলিখিত কমান্ডটি কাজ করে:

```{r message=FALSE, results='hide'}
knit('myfile.rmd', tangle=TRUE)
source('myfile.R')
```

যেখানে results='hide'যদি আউটপুট আকাঙ্ক্ষিত ছিল বাদ দেওয়া যেতে পারে। অর্থাত, knitr থেকে আর কোড আউটপুট myfile.rmdমধ্যে myfile.R

তবে এটি নিখুঁত বলে মনে হচ্ছে না:

  • এটির ফলে অতিরিক্ত ফাইল তৈরি হয়
  • যদি ডিসপ্লেতে নিয়ন্ত্রণের প্রয়োজন হয় তবে এটির নিজস্ব কোড অংশে উপস্থিত হওয়া দরকার।
  • এটি সহজ হিসাবে মার্জিত না source(...)

এইভাবে আমার প্রশ্ন: একটি আর মার্কডাউন ফাইলের আর কোড সোর্সিং এর আরও কি মার্জিত উপায় আছে?


আপনার প্রশ্নটি বুঝতে আমি আসলেই খুব কঠিন সময় কাটাচ্ছি (আমি এটি বেশ কয়েকবার পড়েছি)। আপনি সহজেই কোনও Rmdফাইলে অন্য আর স্ক্রিপ্টগুলি উত্স করতে পারেন । তবে আপনি কি অন্যান্য markdownফাইলগুলিতে সোর্স করতে চান কোনও ফাইলটি বোনা হচ্ছে?
মাইসাউরা

4
আমি আর মার্কডাউন ফাইলগুলিতে (যেমন, * .rmd) আর কোড খণ্ডগুলির ভিতরে আর কোডটি উত্স করতে চাই? বিষয়গুলি পরিষ্কার করার চেষ্টা করার জন্য আমি প্রশ্নটি কিছুটা সম্পাদনা করেছি।
জেরোমি অ্যাংলিম

includeল্যাটেক্সের লাইনের সাথে কিছু । যদি মার্কডাউন অন্যান্য মার্কডাউন ডকুমেন্টগুলির অন্তর্ভুক্তিকে সমর্থন করে তবে এ জাতীয় ফাংশন তৈরি করা তুলনামূলকভাবে সহজ হওয়া উচিত।
পল হিমস্ট্র্রা

@ পোলহিমস্ট্র্রা আমি অনুমান করি যে পাঠ্য এবং আর কোড খণ্ডগুলি উত্সের ক্ষমতাও কার্যকর হবে। আমি বিশেষত কোনও আর মার্কডাউন ডকুমেন্টে কেবল কোডটি সোসোর্স করার কথা ভাবছি।
জেরোমি অ্যাংলিম

উত্তর:


35

দেখে মনে হচ্ছে আপনি ওয়ান-লাইনার সন্ধান করছেন। এটি আপনার মধ্যে রাখার কীভাবে .Rprofile?

ksource <- function(x, ...) {
  library(knitr)
  source(purl(x, output = tempfile()), ...)
}

তবে, আপনি কেন source()আরএমডি ফাইলে কোডটি চান তা আমি বুঝতে পারি না । আমার অর্থ knit()এই নথিতে সমস্ত কোড চালানো হবে, এবং আপনি যদি কোডটি বের করেন এবং একটি খণ্ডে চালান, আপনি যখন সমস্ত কোড দ্বিগুণ চালিত হবেknit() এই দস্তাবেজটি করবেন (আপনি নিজের ভিতরে নিজেকে চালাবেন)। দুটি কাজ পৃথক করা উচিত।

আপনি কি সত্যিই সমস্ত কোড চালাতে চান, তাহলে RStudio এই মোটামুটি সহজ করেছে: Ctrl + Shift + R। এটি মূলত কল করে purl()এবং source()দৃশ্যের পিছনে।


8
হাই @ ইহুই আমি মনে করি এটি সহায়ক কারণ কারণ কখনও কখনও আপনার বিশ্লেষণ ছোট স্ক্রিপ্টগুলিতে সংগঠিত হতে পারে তবে আপনার প্রতিবেদনে আপনি পুরো পাইপলাইনের কোড রাখতে চান।
লুকাসেরোন

9
সুতরাং এখানে ব্যবহারের কেসটি হ'ল আপনি কোডটি সমস্ত লিখতে চান এবং এটি ভারীভাবে নথিভুক্ত ও ব্যাখ্যা করতে চান তবে কোডটি অন্য কোনও স্ক্রিপ্ট দ্বারা চালিত হয়।
ব্রাশ ভারসাম্য

4
@ ব্র্যাশএকুইলিব্রিয়াম কোডটি ব্যবহার করা source()বা knitr::knit()চালানোর বিষয়টি। আমি জানি মানুষ পরবর্তীকালের সাথে কম পরিচিত, তবে purl()এটি নির্ভরযোগ্য নয়। আপনাকে সতর্ক করা হয়েছে: github.com/yihui/knitr/pull/812#issuecomment-53088636
Xie

4
@ ইহুই আপনার দৃষ্টিতে 'সোর্স (পুরল (এক্স, ...)) এর প্রস্তাবিত বিকল্প কী হবে? কোনও উত্স কীভাবে ডুপ্লিকেট খণ্ড লেবেল সম্পর্কিত কোনও ত্রুটি না চালিয়ে একাধিক * .আরএমডি-ফাইল করতে পারে? আমি বরং টু-বি-সোর্স ডকুমেন্টে ফিরে গিয়ে এটি বুনতে চাই না। আমি অনেকগুলি ফাইলের জন্য * .আরএমডি ব্যবহার করি, যেটি আমাকে অন্যদের সাথে রফতানি করতে হবে এবং তাদের সাথে আলোচনা করতে হবে, তাই বিশ্লেষণের সমস্ত পদক্ষেপের জন্য একাধিক আরএমডি-ফাইলের উত্স হতে পেরে ভাল লাগবে।
পরিসংখ্যান- hb

নাইটার ত্রুটিটি প্রকাশ করে "ত্রুটি: প্রয়োজনীয় প্যাকেজটি অনুপস্থিত", যখন এটি .rmd ফাইলটি রেন্ডার করে। অনুপস্থিত প্যাকেজের নাম সম্বলিত আসল ত্রুটি বার্তা সন্ধান করতে আমাকে .rmd ফাইলে কোড চালাতে হবে। একটি কেস এসভিএমের সাথে caretপ্রয়োজন kernlab
CW

19

সাধারণ কোডটি একটি পৃথক আর ফাইলের মধ্যে ফ্যাক্টর করুন এবং তারপরে যে আরএমডি ফাইলটি আপনি চান সেটিতে আর ফাইলটি উত্স করুন।

সুতরাং উদাহরণস্বরূপ বলি যে আমার কাছে আমার দুটি প্রতিবেদন তৈরি করতে হবে, ফ্লু আউটব্রেকস এবং বন্দুক বনাম বাটার বিশ্লেষণ। স্বাভাবিকভাবেই আমি দুটি আরএমডি ডকুমেন্ট তৈরি করেছি এবং এটি দিয়ে সম্পন্ন করব।

এখন ধরা যাক বস আসেন এবং ফ্লু আউটব্রেকস বনাম বাটারের দামগুলির পরিবর্তিততাগুলি দেখতে চান (9 মিমি গোলাবারুদ নিয়ন্ত্রণ করে)।

  • নতুন প্রতিবেদনে প্রতিবেদনগুলি বিশ্লেষণের জন্য কোড অনুলিপি করা এবং আটকানো কোড পুনরায় ব্যবহার ইত্যাদির জন্য খারাপ ধারণা etc.
  • আমি এটি দেখতে সুন্দর দেখতে চাই

আমার সমাধানটি এই ফাইলগুলিতে প্রকল্পটি ফ্যাক্টর করা ছিল:

  • ফ্লু.আরএমডি
    • ফ্লু_ডাটা_ইম্পোর্ট.আর
  • বন্দুক_এন_বাটার.আরএমডি
    • বন্দুক_ডাটা_ইম্পোর্ট.আর
    • মাখন_ডাটা_ইম্পোর্ট.আর

প্রতিটি আরএমডি ফাইলের মধ্যে আমার মতো কিছু থাকে:

```{r include=FALSE}
source('flu_data_import.R')
```

এখানে সমস্যা হ'ল আমরা পুনরুত্পাদনযোগ্যতা হারাতে পারি। আমার সমাধানটি হ'ল প্রতিটি আরএমডি ফাইলে অন্তর্ভুক্ত করার জন্য একটি সাধারণ শিশু নথি তৈরি করা। সুতরাং আমি তৈরি প্রতিটি আরএমডি ফাইলের শেষে, আমি এটি যুক্ত করি:

```{r autodoc, child='autodoc.Rmd', eval=TRUE}
``` 

এবং অবশ্যই অটোডোক.আরএমডি:

Source Data & Code
----------------------------
<div id="accordion-start"></div>

```{r sourcedata, echo=FALSE, results='asis', warnings=FALSE}

if(!exists(autodoc.skip.df)) {
  autodoc.skip.df <- list()
}

#Generate the following table:
for (i in ls(.GlobalEnv)) {
  if(!i %in% autodoc.skip.df) {
    itm <- tryCatch(get(i), error=function(e) NA )
    if(typeof(itm)=="list") {
      if(is.data.frame(itm)) {
        cat(sprintf("### %s\n", i))
        print(xtable(itm), type="html", include.rownames=FALSE, html.table.attributes=sprintf("class='exportable' id='%s'", i))
      }
    }
  }
}
```
### Source Code
```{r allsource, echo=FALSE, results='asis', warning=FALSE, cache=FALSE}
fns <- unique(c(compact(llply(.data=llply(.data=ls(all.names=TRUE), .fun=function(x) {a<-get(x); c(normalizePath(getSrcDirectory(a)),getSrcFilename(a))}), .fun=function(x) { if(length(x)>0) { x } } )), llply(names(sourced), function(x) c(normalizePath(dirname(x)), basename(x)))))

for (itm in fns) {
  cat(sprintf("#### %s\n", itm[2]))
  cat("\n```{r eval=FALSE}\n")
  cat(paste(tryCatch(readLines(file.path(itm[1], itm[2])), error=function(e) sprintf("Could not read source file named %s", file.path(itm[1], itm[2]))), sep="\n", collapse="\n"))
  cat("\n```\n")
}
```
<div id="accordion-stop"></div>
<script type="text/javascript">
```{r jqueryinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(url("http://code.jquery.com/jquery-1.9.1.min.js")), sep="\n")
```
</script>
<script type="text/javascript">
```{r tablesorterinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(url("http://tablesorter.com/__jquery.tablesorter.js")), sep="\n")
```
</script>
<script type="text/javascript">
```{r jqueryuiinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(url("http://code.jquery.com/ui/1.10.2/jquery-ui.min.js")), sep="\n")
```
</script>
<script type="text/javascript">
```{r table2csvinclude, echo=FALSE, results='asis', warning=FALSE}
cat(readLines(file.path(jspath, "table2csv.js")), sep="\n")
```
</script>
<script type="text/javascript">
  $(document).ready(function() {
  $('tr').has('th').wrap('<thead></thead>');
  $('table').each(function() { $('thead', this).prependTo(this); } );
  $('table').addClass('tablesorter');$('table').tablesorter();});
  //need to put this before the accordion stuff because the panels being hidden makes table2csv return null data
  $('table.exportable').each(function() {$(this).after('<a download="' + $(this).attr('id') + '.csv" href="data:application/csv;charset=utf-8,'+encodeURIComponent($(this).table2CSV({delivery:'value'}))+'">Download '+$(this).attr('id')+'</a>')});
  $('#accordion-start').nextUntil('#accordion-stop').wrapAll("<div id='accordion'></div>");
  $('#accordion > h3').each(function() { $(this).nextUntil('h3').wrapAll("<div>"); });
  $( '#accordion' ).accordion({ heightStyle: "content", collapsible: true, active: false });
</script>

এনবি, এটি আরএমডি -> এইচটিএমএল কর্মপ্রবাহের জন্য ডিজাইন করা হয়েছে। আপনি ক্ষীরের সাথে বা অন্য কোনও কিছুতে যান তবে এটি একটি কুরুচিপূর্ণ জগাখিচুড়ি হবে। এই আরএমডি ডকুমেন্টটি সমস্ত উত্স () এর এড ফাইলগুলির জন্য বিশ্ব পরিবেশের দিকে নজর রাখে এবং আপনার নথির শেষে তাদের উত্সকে অন্তর্ভুক্ত করে। এটিতে জ্যাকোরি ইউআই, টেবিলসোর্টার অন্তর্ভুক্ত রয়েছে এবং উত্সযুক্ত ফাইলগুলি দেখানোর / আড়াল করার জন্য অ্যাকর্ডিয়ন শৈলী ব্যবহার করার জন্য ডকুমেন্টটি সেট আপ করে। এটি একটি কাজ চলছে, তবে এটিকে আপনার নিজের ব্যবহারের সাথে খাপ খাইয়ে নিতে দ্বিধা বোধ করবেন।

ওয়ান-লাইনার নয়, আমি জানি। আশা করি এটি আপনাকে কমপক্ষে কিছু ধারণা দেয় :)


4

সম্ভবত একটি পৃথক চিন্তা শুরু করা উচিত। আমার সমস্যাটি হ'ল: আপনার সাধারণত প্রতিটি কোডটি একটি .আরএম ফাইলে একটি .আরএমডি অংশে লিখুন। আরএমডি ডকুমেন্টের জন্য আপনি বুনন ব্যবহার করেন অর্থাৎ একটি এইচটিএমএল, আপনি কেবল রেখে গেছেন

```{R Chunkname, Chunkoptions}  
source(file.R)  
```

এইভাবে আপনি সম্ভবত .R ফাইলগুলির একগুচ্ছ তৈরি করবেন এবং আপনি ctrl + Alt + n (বা + সি ব্যবহার করে "কোডের পরে অংশ" সমস্ত প্রক্রিয়া করার সুবিধা হারাবেন, তবে সাধারণত এটি কার্যকর হয় না)। তবে, আমি মিঃ গ্যান্ড্রুডের পুনরুত্পাদনযোগ্য গবেষণা সম্পর্কে বইটি পড়েছি এবং বুঝতে পেরেছি যে তিনি অবশ্যই নিট এবং .আরএমডি ফাইলগুলি কেবলমাত্র এইচটিএমএল ফাইল তৈরির জন্য ব্যবহার করেন। মূল বিশ্লেষণ নিজেই একটি .R ফাইল। আমি মনে করি .আরএমডি ডকুমেন্টগুলি খুব দ্রুত বাড়তে থাকে যদি আপনি নিজের পুরো বিশ্লেষণটি ভিতরেই করা শুরু করেন।


3

আপনি যদি কোডের ঠিক পরে থাকেন তবে আমি মনে করি এই লাইনের সাথে কিছু কাজ করা উচিত:

  1. দিয়ে মার্কডাউন / আর ফাইলটি পড়ুন readLines
  2. ব্যবহার করুন grepলাইন যে দিয়ে শুরু অনুসন্ধানের জন্য কোড খন্ডে খোঁজার, <<<উদাহরণস্বরূপ
  3. শুধুমাত্র কোড পেতে মূল লাইনগুলিতে থাকা অবজেক্টটির সাবসেট নিন
  4. এটি ব্যবহার করে একটি অস্থায়ী ফাইলে ডাম্প করুন writeLines
  5. আপনার আর সেশনে এই ফাইলটি উত্স করুন

কোনও ফাংশনে এটিকে মোড়ানো আপনার যা প্রয়োজন তা আপনাকে দেওয়া উচিত।


4
আপনাকে ধন্যবাদ, আমি অনুমান করি যে এটি কার্যকর হবে। যাইহোক, প্রথম চারটি পয়েন্ট শোনাচ্ছে যে স্ট্যাংলে ইতিমধ্যে সোয়েভের জন্য একটি নির্ভরযোগ্য উপায়ে কী করেছে knit('myfile.rmd', tangle=TRUE)এবং নিটারে কী করে। আমি অনুমান করি যে আমি এমন একটি লাইনার সন্ধান করছি যা উভয় জট এবং উত্স এবং আদর্শভাবে কোনও ফাইল তৈরি করে না।
জেরোমি অ্যাংলিম

একবার আপনি এটি কোনও ফাংশনে মুড়ে ফেললে এটি অনিলাইনারে পরিণত হয়;)। আপনি যা করতে পারেন তা হ'ল textConnectionকোনও ফাইল নকল করা এবং সেখান থেকে উত্স। এটি কোনও ফাইল তৈরি হওয়া এড়াতে পারে।
পল হিমস্ট্র্রা

হ্যাঁ. textConnectionদেখার জায়গা হতে পারে।
জেরোমি অ্যাংলিম

2

নিম্নলিখিত হ্যাক আমার জন্য ভাল কাজ করেছে:

library(readr)
library(stringr)
source_rmd <- function(file_path) {
  stopifnot(is.character(file_path) && length(file_path) == 1)
  .tmpfile <- tempfile(fileext = ".R")
  .con <- file(.tmpfile) 
  on.exit(close(.con))
  full_rmd <- read_file(file_path)
  codes <- str_match_all(string = full_rmd, pattern = "```(?s)\\{r[^{}]*\\}\\s*\\n(.*?)```")
  stopifnot(length(codes) == 1 && ncol(codes[[1]]) == 2)
  codes <- paste(codes[[1]][, 2], collapse = "\n")
  writeLines(codes, .con)
  flush(.con)
  cat(sprintf("R code extracted to tempfile: %s\nSourcing tempfile...", .tmpfile))
  source(.tmpfile)
}

2

আমি নিম্নলিখিত কাস্টম ফাংশন ব্যবহার

source_rmd <- function(rmd_file){
  knitr::knit(rmd_file, output = tempfile())
}

source_rmd("munge_script.Rmd")


1

আমি মূল বিশ্লেষণ এবং গণনা কোডটি .R ফাইলে রাখার এবং .আরএমডি ফাইলে প্রয়োজনীয় অংশগুলি আমদানি করার পরামর্শ দেব। আমি প্রক্রিয়াটি এখানে ব্যাখ্যা করেছি ।


1

sys.source ("./ আপনার_সক্রিপ্ট_ফাইলে_নাম.আর", এনভির = নিট :: নিট_গ্লোবাল ())

আপনার_স্ক্রিপ্ট_ফাইলে_নাম.আর মধ্যে থাকা ফাংশনগুলিকে কল করার আগে এই আদেশটি দিন।

আপনার_স্ক্রিপ্ট_ফाइल_নামের আগে "./" যুক্ত করা হচ্ছে। আপনি যদি ইতিমধ্যে কোনও প্রকল্প তৈরি করেন তবে আপনার ফাইলের দিকনির্দেশ প্রদর্শন করতে।

আপনি আরও বিশদে এই লিঙ্কটি দেখতে পাবেন: https://bookdown.org/yihui/rmarkdown-cookbook/source-script.html



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.