Вызывая knitr внутри функции
Я использовал knitr, R markdown и pandoc для создания презентаций / лекций для beamer для курса, который я буду преподавать осенью. Я написал короткий R-скрипт для автоматизации процесса (аналог файла `make'), который включает в себя:
- вязание
.Rmd
файл; - Вызов Пандока, чтобы создать
.tex
файл; - Компиляция
.tex
файл; - Очистка (удаление ненужных файлов) и т. Д.
Кажется, все работает довольно хорошо, за одним исключением (на сегодняшний день). У меня есть одна лекция, которая, кажется, хорошо "вязается" только тогда, когда я вызываю функцию вязания напрямую. Когда я пытаюсь использовать мой 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" из другой функции может изменить поведение кода?
----------------- Обновление от 01.05.2014 ----------------------
Я снова протестировал код, на этот раз поместив "(" и ")" вокруг Ais. Опять же, все работает нормально, если я набираю knit("test.Rmd"), но не при использовании my.knit(). Вот вывод в файле.md, когда я набираю my.knit():
## 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 или около того других презентаций, используя этот подход без проблем. Хэдли, спасибо за предложение взглянуть на пакет rmarkdown. Я использую RStudio и признаю, что есть встроенная функциональность для достижения многих моих целей. Одно из преимуществ того, что у меня настроено на данный момент, заключается в том, что я могу использовать заголовочный файл (в латексе), общий для всех презентаций, а затем просто использовать \includeonly, чтобы сохранить фрагменты, которые я хочу для лекции в любой день.
1 ответ
Согласно моему опыту, эта проблема, вероятно, обнаруживает ошибку в пакете мозаики. Я не знаком с этим пакетом, но вот минимальный воспроизводимый пример без 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()
, который не работает для мозаики в данный момент.