LoginSignup
9

More than 5 years have passed since last update.

R Markdownファイルからコード部分だけを抜き出してRファイルに出力

Posted at

毎度忘れるのでメモ。

サンプルファイルの準備

以下のファイルがあるとします:

---
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## hogehoge

hogehoge.

```{r cars}
# hogehoge
summary(cars)
```

## fugafuga

Why are you using SJIS?

```{r pressure, echo=FALSE}
#' fugafuga
#' hogfuga
plot(pressure)
```

end.

このファイルをpurl_test.Rmdとします。

knitr::purl()で抜き出し

チャンク内のコード部分を抜き出して別のRスクリプトファイルに吐き出させるにはknitr::purl()関数を使います:

> knitr::purl("purl_test.Rmd")


processing file: purl_test.Rmd
  |.................................................................| 100%
output file: purl_test.R

[1] "purl_test.R"

これでpurl_test.Rというファイルが生成されます。内容はこんな感じ:

purl_test.R
## ----setup, include=FALSE------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)

## ----cars----------------------------------------------------------------
# hogehoge
summary(cars)

## ----pressure, echo=FALSE------------------------------------------------
#' fugafuga
#' hogfuga
plot(pressure)

シンプルな仕上がりです。

引数による出力パターンの指定

先の例だと,各チャンクのヘッダー部分も持ってきてくれています。このknitr::purl()documentation=という引数があり,出力のパターンを指定することができます:

  • documentation = 0: チャンク内のコードのみのピュアなRスクリプトを出力
  • documentation = 1: 各チャンクのヘッダー部分も合わせて持ってくる(デフォルト)
  • documentation = 2: チャンク部分以外のテキスト(冒頭yaml部分も含む)を,roxygenスタイルのコメント(#')で全て持ってくる

ということで引数を与えてみて試してみます。なおすでに生成予定のファイル名と同一のものが存在している場合,上書きされず何もされないみたいです。

knitr::purl("purl_test.Rmd", documentation = 0)の実行結果は以下の通り:

purl_test.R
knitr::opts_chunk$set(echo = TRUE)
# hogehoge
summary(cars)
#' fugafuga
#' hogfuga
plot(pressure)

そして,knitr::purl("purl_test.Rmd", documentation = 2)の実行結果は以下の通り:

purl_test.R
#' ---
#' title: "Untitled"
#' output: html_document
#' ---
#' 
## ----setup, include=FALSE------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)

#' 
#' ## hogehoge
#' 
#' hogehoge.
#' 
## ----cars----------------------------------------------------------------
# hogehoge
summary(cars)

#' 
#' ## fugafuga
#' 
#' Why are you using SJIS?
#' 
## ----pressure, echo=FALSE------------------------------------------------
#' fugafuga
#' hogfuga
plot(pressure)

#' 
#' end.

最後の2はパッケージ開発とかで使えそうですし,01も状況によって使えそうですね。

Enjoy!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9