5

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

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

一切似乎都很好,除了一个例外(迄今为止)。我有一节课似乎只有当我直接调用 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<-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
```

这很奇怪,因为我已经使用这种方法创建了 10 个左右的其他演示文稿而没有问题。Hadley,感谢您建议查看 rmarkdown 包。我正在使用 RStudio,并认识到内置功能可以实现我的许多目标。我目前如何设置的一个优点是我可以使用所有演示文稿通用的头文件(在乳胶中),然后只需使用 \includeonly 来保留我想要在任何一天的讲座中使用的部分。

4

1 回答 1

4

根据我的经验,这个问题可能揭示了马赛克包中的一个错误。我不熟悉这个包,但这是一个没有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()目前不适用于马赛克

于 2014-05-08T04:56:51.703 回答