在函数中调用knitr

时间:2014-04-30 16:15:14

标签: r knitr r-mosaic

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

  1. 编织.Rmd文件;
  2. 调用pandoc创建.tex文件;
  3. 编译.tex文件;
  4. 清理(删除不必要的文件)等
  5. 一切似乎都很好,有一个例外(迄今为止)。我有一个似乎是"编织"只有当我直接调用编织功能时。当我尝试使用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
    }
    ```
    

    此文件&#34; knits&#34;如果我输入knit(&#34; test.Rmd&#34;),那就好了。但是,如果我创建一个名为my.knit&lt; -fucntion(){knit(&#34; test.Rmd&#34;)}的函数,并使用此函数通过键入my.knit()来进行编织,我得到输出中的错误消息指出:

    Error: object 'Ais' not found

    任何想法为什么打电话&#34;编织&#34;从另一个函数会改变代码的行为?

    ----------------- 2014年5月1日更新---------------------- < / H2>

    我再次测试了代码,这次是将#34;(&#34;和&#34;)&#34;在Ais周围。再次,如果我输入knit(&#34; test.Rmd&#34;),但是在使用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保留我想要的讲座。

1 个答案:

答案 0 :(得分: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()目前不适用于镶嵌