我一直在使用knitr,R markdown和pandoc为我将在秋季教授的类(class)创建投影仪演示/讲座。我编写了一个简短的R脚本来自动化该过程(类似于“make”文件),其中涉及:
.Rmd
文件; .tex
文件; .tex
文件; 一切似乎都运行良好,只有一个异常(exception)(迄今为止)。只有当我直接调用knit函数时,我的一场讲座似乎才能很好地“编织”。当我尝试使用
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
}
```
如果我输入knit(“test.Rmd”),则此文件“编织”良好。但是,如果我创建一个名为my.knit
Error: object 'Ais' not found
知道为什么从另一个函数调用“编织”会改变代码的行为吗?
----------------- 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
```
自从我使用这种方法创建了十个左右的演示文稿以来,这很奇怪,这没有问题。哈德利(Hadley),非常感谢您建议研究rmarkdown软件包。我正在使用RStudio,并且认识到内置功能可以实现我的许多目标。我现在可以进行设置的一个优点是,我可以使用所有演示文稿通用的头文件(在 latex 中),然后仅使用\includeonly即可在任何给定的日期保留我要用于演讲的内容。
最佳答案
根据我的经验,此问题可能表明 mosaic 软件包中存在错误。我对这个软件包不熟悉,但是这是一个没有 knitr 的可重现的最小示例:
local({
library(mosaic)
foo = 5
do(10) * {
mean(foo + rnorm(100))
}
})
它给出如下错误:
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
我相信
do
和*
在单独的环境中应该可以工作,即它们不仅应该在全局环境中工作。只要镶嵌开发人员可以解决此问题,您的功能就可以正常工作。如果您不想打扰任何人或不等待解决问题,则可以肯定地在全局环境中调用
knit()
,例如knit(..., envir = globalenv())
默认情况下,为
envir = parent.frame()
,该功能目前不适用于马赛克。