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

  • 编织一个.Rmd文件;
  • 调用pandoc创建一个.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(),该功能目前不适用于马赛克

    10-06 05:44