如何使用 render 在 R Rmarkdown 文件中的函数中使用变量

How to use a variable inside a function in a R Rmarkdown file, using render

提问人:Malta 提问时间:12/4/2017 最后编辑:Malta 更新时间:12/4/2017 访问量:594

问:

我有一个 rmarkdown 文件,我用它来编织:我在 .R,然后,我使用函数编织了 Rmd。我的问题是,如果我封装渲染函数以使我的代码更具可读性,它就不再起作用了。下面是一个基本的例子: -我。Rmd 文件:rmarkdown::render

---
title: "test"
output: html_document
---

```{r}
printA()
```

我的R代码可以工作:

library(rmarkdown)
a<- 5
printA <- function() {
  return(a)
}
render("c:/users/db7trs/desktop/test.Rmd")

但是当我将其封装在一个函数中时,它不再起作用了:

library(rmarkdown)
printA <- function() {
  return(a)
}
rendre <- function(){
  a <- 5
  render("c:/users/db7trs/desktop/test.Rmd")
}

rendre()

使用此代码,我有一个非常明确的错误:。Quitting from lines 7-8 Error in printA() : object 'a' not found

如果我显式地对 printA 函数进行参数,这个问题将很容易解决,在这种情况下,这无论如何都是一个很好的做法,但我不明白为什么它在这两种情况下的工作方式不同。

渲染 R-Markdown

评论

0赞 Cedric 12/4/2017
您应该为 printA 提供代码,我们猜它当然是什么
0赞 Malta 12/4/2017
哦,对不起,你是对的,我已经编辑了我的问题
0赞 Cedric 12/4/2017
stackoverflow.com/questions/34029611/......
0赞 Malta 12/4/2017
谢谢我看到了这个问题,我经常使用第一个解决方案(使用 render 而不是 knit),我发现代码最好保持可读性,并且可以快速执行:我的数据被处理或加载一次,在 Rmd 中我只不过是显示问题。但是我不明白为什么在“rendre”函数中声明的 a 对象不能在 Rmd 中使用的另一个函数中使用。
0赞 Cedric 12/4/2017
对不起,我只是偶然发现了那个链接。是的,sebastien 是对的,当您调用 render 时,它会评估父帧中的内容,没问题,但是您的函数 printA 从 .globalEnv 访问对象

答:

2赞 Sébastien Rochette 12/4/2017 #1

您的问题更多的是该函数未在函数中声明。(即使错误消息说的是 )。因此,您可以在文件内部或内部声明您的函数。printArendre()arendre()Rmd

内部功能rendre()

rendre <- function(){
  printA <- function() {
    return(a)
  }
  a <- 5
  render("c:/users/db7trs/desktop/test.Rmd")
}

或者在test.Rmd

---
title: "test"
output: html_document
---

```{r}
printA <- function() {
  return(a)
}
printA()
```

评论

0赞 Malta 12/4/2017
我很迷茫:你的解决方案有效,所以我想同意问题确实出在函数声明上,但另一方面,如果函数 printA 返回 1 而不是 a,它也有效,尽管它不应该与您的假设一起使用(除非我误解了什么)
0赞 Sébastien Rochette 12/4/2017
真。全球环境与本地环境有一些东西,但我不能给你确切的解释......