使用R Markdown文档作为函数的来源

时间:2016-02-26 11:41:44

标签: r r-markdown

我正在研究R Markdown,以记录我经常使用的功能。我会将它们放入一个R Markdown文件来记录它们,然后能够阅读我在函数背后的想法,如果我几个月后再回来它

我的问题是,如果我开始一个新的R项目,是否有可能获取r markdown文件并使用我创建的函数库,只需通过调用它们,如果我采购常规R文件。我真的不想保留两组函数文件

我很欣赏这可能是一个初学者的问题,但任何指向教程等的帮助将不胜感激

由于

2 个答案:

答案 0 :(得分:3)

正如评论中提到的,您可能应该为此目的创建一个包。但是,如果您坚持在脚本中放置函数定义并使用RMarkdown文件对其进行记录,则可以使用read_chunk()包中的knitr

请注意,此方法与您请求的方法略有不同。您希望将markdown文件中的函数定义与文档一起使用。然后你想以某种方式将该文件导入R脚本以便使用该函数。我没有找到办法做到这一点(即使有可能)。

我建议的替代方案是将函数定义放在自己的R脚本中,比如fun.R。然后,Rmarkdown文件从fun.R读取函数定义并添加文档。如果要在其他一些脚本中使用该函数,可以只输入fun.R(而不是markdown文件)。这仍然意味着您只需要维护一次函数定义的代码。

让我以一个例子来说明这一点。这是fun.R

## ---- fun
fun <- function(x) x^2

第一行是稍后将使用的标识符。降价文件如下:

---
title: "Documentation of fun()"
output: html_document
---

This documents the function `fun()` defined in `fun.R`.
```{r,cache = FALSE}
knitr::read_chunk("fun.R")
```

This is the function definition
```{r fun}
```

This is an example of how  to use `fun()`:
```{r use_fun}
fun(3)
```

第一个块使用fun.R读入knitr::read_chunk。稍后,您可以定义一个空块,该块具有fun.R中使用的标识符作为其名称。这将表现为fun.R的内容直接写在此文件中。如您所见,您也可以在以后的块中使用fun()。这是生成的html文件的屏幕截图:

enter image description here

在您要使用fun()的脚本中,只需添加source("fun.R")即可获取函数定义。

您还可以在单​​个R文件中包含多个函数,并仍然单独记录它们。只需在每个函数定义之前放置一个以## ----开头的标识符,然后创建引用每个标识符的空块。

这肯定比你要求的要复杂一些,因为它涉及两个文件而不是一个。但至少没有冗余

答案 1 :(得分:0)

也许这已足够接近 - 您可以使用github klmr / modules软件包(而不是CRAN模块软件包)将roxygen2文档和代码组合在一个文件中,而无需创建软件包。例如,在安装模块包之后将其复制到剪贴板,然后将其粘贴到R控制台中以创建带有嵌入式文档的单个文件模块。随后的代码然后导入它,从中运行一个函数并调用帮助。有关详细信息,请参阅模块包的文档。

请注意,这具有以下优点:(1)所有内容都在一个文件中,(2)如果您以后决定使用软件包,则可以使用包含roxygen2的同一文件 - 不需要修改任何东西,(3)任何对roxygen2的学习也适用于包裹。

# create a file with our documentation and code

Lines <- "
#' Add two numbers.
#'
#' @param x the first number.
#' @param y the second number.
#' @return The sum.
#' @note This is just a simple example.
#'
#' This function is a simple example intended to show how to use the modules
#' package with roxygen2.
add2 <- function(x, y) x + y
"
cat(Lines, file = "test.R")


# now we can import it 
# devtools::install_github("klmr/modules")
library(modules)

test <- import("test")  # do not include the .R extension

test$add2(1, 2)
## [1] 3

# this will cause help page to appear
?test$add2