10

これについてはすでにいくつかの質問がありますが、それらは不明確であるか、おそらく時代遅れであるために機能しない解決策を提供しています。

大規模プロジェクト向けのモジュール化されたコード構造

R Markdown/Notebook は優れていますが、その表示方法では、通常、すべてのテキストとすべてのコード チャンクを含む 1 つのファイルがあります。このような単一のファイル構造が適切な設定ではないプロジェクトがよくあります。代わりに、他のファイルを順番にロードする単一の.Rマスター ファイルを使用します。.RR Notebook を使用してこの構造を複製したいと思います。つまり、複数のファイルから.Rmdコードを呼び出す単一のファイルがあるようにします。.R

この方法でプロジェクトを操作することの良い点は、.Rファイルを使用して RStudio を使用した通常のワークフローがうまくいくだけでなく、コードを複製することなく R Notebook/Markdown からのきちんとした出力が可能になることです。

最小限の例

これは、例をできるだけ小さくするために単純化されています。2 つの.Rファイルと 1 つのマスター.Rmdファイル。

start.R

# libs --------------------------------------------------------------------
library(pacman)
p_load(dplyr, ggplot2)
#normally load a lot of packages here

# data --------------------------------------------------------------------
d = iris
#use iris for example, but normally would load data from file

# data manipulation tasks -------------------------------------------------
#some code here to extract useful info from the data
setosa = dplyr::filter(d, Species == "setosa")

plot.R

#setosa only
ggplot(setosa, aes(Sepal.Length)) +
  geom_density()

#all together
ggplot(d, aes(Sepal.Length, color = Species)) +
  geom_density()

次に、ノートブック ファイル:

notebook.Rmd:

---
title: "R Notebook"
output:
  html_document: default
  html_notebook: default
---

First we load some packages and data and do slight transformation:

```{r start}
#a command here to load the code from start.R and display it
```

```{r plot}
#a command here to load the code from plot.R and display it
```

望ましい出力

望ましい出力は、 のコード チャンクstart.Rとの間でコードを手動でコピーすることで得られるものです。これは次のようになります (画面スペースが不足しているため一部が欠落しています)。plot.Rnotebook.Rmd

ここに画像の説明を入力

私が試したこと

source

これにより、コードが読み込まれますが、表示されません。source次のコマンドを表示するだけです。

ここに画像の説明を入力

knitr::read_chunk

このコマンドはここで言及されていましたが、実際には、source私が知る限り同じことを行います。コードをロードしますが、何も表示しません。

ここに画像の説明を入力

目的の出力を得るにはどうすればよいですか?

4

3 に答える 3

4

解決策は、knitr のチャンク オプションを使用することcodeです。Knitr docsによると:

code: (NULL; 文字) 提供された場合、現在のチャンクのコードを上書きします。これにより、現在のチャンクにプログラムでコードを挿入できます。たとえば、チャンク オプション code = capture.output(dump('fivenum', '')) は、fivenum 関数のソース コードを使用して現在のチャンクを置き換えます。

ただし、例は示されていません。文字ベクトルをフィードする必要があるように聞こえるので、試してみましょうreadLines:

```{r start, code=readLines("start.R")}
```

```{r plot, code=readLines("start.R")}
```

これにより、目的の出力が生成されるため、モジュール化されたプロジェクト構造が可能になります。

ファイルを直接フィードしても機能しませんが (つまりcode="start.R")、機能強化としては優れています。

于 2016-11-10T04:19:32.657 に答える
2

read_chunkR ノートブックとの相互運用性のために、上記のようにKnitr の方法を使用できます。read_chunkノートブックでは、セットアップ チャンクを呼び出す必要があります。ノートブック チャンクは任意の順序で実行できるため、外部コードを常に利用できるようになります。

read_chunk外部 R スクリプトからノートブックにコードを取り込むために使用する最小限の例を次に示します。

たとえば .Rmd

```{r setup}
knitr::read_chunk("example.R")
```

```{r chunk}
```

例.R

## ---- chunk
1 + 1

ノートブックで空のチャンクを実行すると、外部ファイルからのコードが挿入され、チャンクにそのコードが含まれているかのように、結果がインラインで表示されます。

ノートブック出力

于 2017-03-21T17:08:59.330 に答える
1

上記の私のコメントによると、私は here ライブラリを使用してフォルダー内のプロジェクトを操作します。

 ```{ r setup, echo=FALSE, message=FALSE, warning=FALSE, results='asis'}

library(here) 

insert <- function(filename){
  readLines(here::here("massive_report_folder", filename))
}
```

そして、各チャンクは次のようになります

```{ r setup, echo=FALSE, message=FALSE, warning=FALSE, 
        results='asis', code=insert("extra_file.R")}
```
于 2018-04-17T14:29:21.127 に答える