Вызывая knitr внутри функции

Я использовал knitr, R markdown и pandoc для создания презентаций / лекций для beamer для курса, который я буду преподавать осенью. Я написал короткий R-скрипт для автоматизации процесса (аналог файла `make'), который включает в себя:

  1. вязание .Rmd файл;
  2. Вызов Пандока, чтобы создать .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
}
```

Этот файл "вяжет" нормально, если я наберу 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(), который не работает для мозаики в данный момент.

Другие вопросы по тегам