在函数中调用knitr

use*_*548 5 r knitr r-mosaic

我一直在使用knitr,R markdown和pandoc为我将在秋季教授的课程创建投影演示/讲座.我编写了一个简短的R脚本来自动化该过程(类似于`make'文件),其中包括:

  1. 编织.Rmd文件;
  2. 调用pandoc来创建.tex文件;
  3. 编译.tex文件;
  4. 清理东西(删除不必要的文件)等

一切似乎都很好,有一个例外(迄今为止).只有当我直接调用编织功能时,我才有一个似乎"编织好"的讲座.当我尝试使用我的make函数编织.Rmd文件时,某些R对象无法识别.我在下面列举了一个简短的例子来说明问题:

我创建了一个名为"test.Rmd"的文件,其中包含一个代码块(如下所示):

## Simulation

```{r test, comment=NA, message=FALSE, warning=FALSE}
library(mosaic)
obs<-c(25, 22, 30, 40) # Number of observations in each category
Ais<-c(0.34, 0.101, 0.104, 0.455) # Total Accreage (NUll proportions)
e.count<-Ais*117 # Expected Counts
test.stat<-sum((obs-e.count)^2/(e.count)) #Test statistic = 43.6
rand.dist<-do(1000)*{ 
  # Randomization Distribution
  new.dat<-sample(1:4, replace=TRUE, size=117, prob=Ais) # Sample with Prob = Null pi's
  new.obs<-tally(~new.dat) # Simulated counts
  chi.sq<-sum((new.obs-e.count)^2/e.count) # Simulated test statistic
}
```
Run Code Online (Sandbox Code Playgroud)

如果我输入knit("test.Rmd"),这个文件"编织"很好.但是,如果我创建了一个名为my.knit <-fucntion(){knit("test.Rmd")}的函数,并使用此函数通过键入my.knit()来进行编织,我会收到一条错误消息输出表明:

Error: object 'Ais' not found

任何想法为什么从另一个函数调用"knit"会改变代码的行为?

----------------- 2014年5月1日更新----------------------

我再次测试了代码,这次将"("和")"放在Ais周围.再次,如果我输入knit("test.Rmd"),但是在使用my.knit()时不能正常工作.当我输入my.knit()时,这是.md文件中的输出:

## Simulation



```r
library(mosaic)
obs <- c(25, 22, 30, 40)  # Number of observations in each category
(Ais <- c(0.34, 0.101, 0.104, 0.455))  # Total Acreage (NUll proportions)
```

```
[1] 0.340 0.101 0.104 0.455
```

```r
e.count <- Ais * 117  # Expected Counts
test.stat <- sum((obs - e.count)^2/(e.count))  #Test statistic = 43.6
rand.dist <- do(1000) * {
    # Randomization Distribution
    new.dat <- sample(1:4, replace = TRUE, size = 117, prob = Ais)  # Sample with Prob = Null pi's
    new.obs <- tally(~new.dat)  # Simulated counts
    chi.sq <- sum((new.obs - e.count)^2/e.count)  # Simulated test statistic
}
```

```
Error: object 'Ais' not found
```
Run Code Online (Sandbox Code Playgroud)

它很奇怪,因为我使用这种方法创建了10个左右的其他演示文稿没有问题.Hadley,感谢您关注rmarkdown软件包的建议.我正在使用RStudio,并认识到内置功能可以实现我的许多目标.我目前设置的东西的一个优点是我可以使用所有演示文稿中共有的头文件(在latex中)然后只需使用\ includeonly来保存我想要的任何一天的演讲.

Yih*_*Xie 4

根据我的经验,这个问题可能揭示了马赛克包中的一个错误。我不熟悉这个包,但这是一个没有knit 的最小可重现示例:

local({
  library(mosaic)
  foo = 5
  do(10) * {
    mean(foo + rnorm(100))
  }
})
Run Code Online (Sandbox Code Playgroud)

它给出如下错误:

                                                          result
1  Error in eval(expr, envir, enclos) : object 'foo' not found\n
2  Error in eval(expr, envir, enclos) : object 'foo' not found\n
3  Error in eval(expr, envir, enclos) : object 'foo' not found\n
4  Error in eval(expr, envir, enclos) : object 'foo' not found\n
5  Error in eval(expr, envir, enclos) : object 'foo' not found\n
6  Error in eval(expr, envir, enclos) : object 'foo' not found\n
7  Error in eval(expr, envir, enclos) : object 'foo' not found\n
8  Error in eval(expr, envir, enclos) : object 'foo' not found\n
9  Error in eval(expr, envir, enclos) : object 'foo' not found\n
10 Error in eval(expr, envir, enclos) : object 'foo' not found\n
Warning message:
In mclapply(integer(n), function(...) { :
  all scheduled cores encountered errors in user code
Run Code Online (Sandbox Code Playgroud)

我相信do并且*应该在它们处于单独的环境中时工作,即它们不应该仅仅在全球环境中工作。只要马赛克开发人员能够解决这个问题,您的功能就应该可以工作。

如果你不想打扰任何人或等待问题得到解决,你当然可以调用knit()全局环境,例如

knit(..., envir = globalenv())
Run Code Online (Sandbox Code Playgroud)

默认情况下, ,目前envir = parent.frame()不适用于马赛克。