98

多くの場合、メインの R Markdown ファイルまたは Knitr LaTeX ファイルがあり、そこにsource別の R ファイル (データ処理用など) があります。ただし、場合によっては、これらのソース ファイルを独自の再現可能なドキュメントにすることが有益であると考えていました (たとえば、データ処理のコマンドを含むだけでなく、データ処理の決定を説明する再現可能なドキュメントを生成する R Markdown ファイルなど)。 )。

source('myfile.rmd')したがって、メインの R Markdown ファイルのようなコマンドが必要です。の R コード チャンク内のすべての R コードを抽出してソース化しますmyfile.rmd。もちろん、これはエラーを引き起こします。

次のコマンドが機能します。

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

出力が必要な場合はwhereresults='hide'を省略できます。つまり、 Knitr は R コードをmyfile.rmdinto に出力しmyfile.Rます。

ただし、完璧ではないようです。

  • 余分なファイルが作成されます
  • 表示の制御が必要な場合は、独自のコード チャンクに表示する必要があります。
  • シンプルほどエレガントではありませんsource(...)

したがって、私の質問: R Markdown ファイルの R コードを取得するよりエレガントな方法はありますか?

4

12 に答える 12

37

ワンライナーを探しているようです。これをあなたの中に入れてみ.Rprofileませんか?

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

source()ただし、 Rmd ファイル自体のコードが必要な理由がわかりません。つまりknit()、このドキュメント内のすべてのコードを実行します。コードを抽出してチャンクで実行すると、knit()このドキュメントを実行するときにすべてのコードが 2 回実行されます (自分自身を実行します)。2 つのタスクは分離する必要があります。

本当にすべてのコードを実行したい場合は、RStudio を使用するとかなり簡単に実行できますCtrl + Shift + R。それは基本的purl()source()舞台裏で呼び出します。

于 2012-06-10T15:44:45.243 に答える
8

Knitr の purl 関数を試してください。

source(knitr::purl("myfile.rmd", quiet=TRUE))

于 2020-02-03T10:24:36.010 に答える
4

おそらく、別のことを考え始める必要があります。私の問題は次のとおりです。通常は.Rmdチャンクにあるすべてのコードを.Rファイルに記述してください。そして、編み物、つまりhtmlに使用するRmdドキュメントの場合、残っているのは

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

この方法では、おそらく多数の .R ファイルを作成し、ctrl+alt+n (または +c ですが、通常はこれは機能しません) を使用してすべてのコードを「チャンクごとに」処理するという利点を失います。しかし、Gandrud 氏による再現可能な研究についての本を読んで、彼は確かに html ファイルを作成するためだけに Knitr ファイルと .Rmd ファイルを使用していることに気付きました。Main Analysis 自体は .R ファイルです。内部で全体の分析を開始すると、.Rmd ドキュメントが急速に大きくなりすぎると思います。

于 2015-04-29T07:07:30.363 に答える
3

コードの直後にいる場合は、次の行に沿って何かが機能するはずです。

  1. でmarkdown/Rファイルを読むreadLines
  2. たとえばgrep、で始まる行を検索して、コードチャンクを見つけるために使用します<<<
  3. 元の行を含むオブジェクトのサブセットを取得して、コードのみを取得します
  4. これを一時ファイルにダンプしますwriteLines
  5. このファイルを R セッションに読み込みます

これを関数でラップすると、必要なものが得られます。

于 2012-06-10T12:16:09.777 に答える
3

次のハックは私にとってはうまくいきました:

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)
}
于 2016-10-19T20:40:46.670 に答える
1

主な分析および計算コードを .R ファイルに保持し、必要に応じてチャンクを .Rmd ファイルにインポートすることをお勧めします。ここでプロセスを説明しました。

于 2016-05-19T22:44:03.373 に答える