如果我在R终端中剪切并粘贴代码,Knitr就不会产生我期待的东西

时间:2013-07-29 20:38:51

标签: r knitr r-markdown

如果我knit以下代码:

```{r, eval=TRUE}
times <- function(total = 3, name="a") {
    ctr <- 1
    function(expr, val, ok, visible) {
        cat("[Task ", name, "] ", ctr,"\n", sep="")
        ctr <<- ctr + 1
        return(ctr <= total)
    }
}

h <- taskCallbackManager()
h$suspend()
h$add(times())
h$add(times(4,"b"))
h$add(times(5,"c"))
h$add(times(6,"d"))
h$suspend(FALSE)
```

我在最后一个命令(h$suspend(FALSE))之后没有输出任何内容。但是,如果我将代码剪切并粘贴到R中,我会得到以下输出:

[Task a] 1
[Task b] 1
[Task c] 1
[Task d] 1

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:0)

这是一个老问题,这可能是不可能的,但今天你可以拦截knitr的一个钩子:

knit_hooks$set(evaluate = function(...) {
  res  <- evaluate::evaluate(...)

  # instead of recordPlot()
  plot <- Filter(evaluate::is.recordedplot, res)
  plot <- if (length(plot)) plot[[1]]

  # expression and equivalent of the globalenv()
  args  <- list(...)
  env   <- args$envir
  expr  <- parse(text = paste(args[[1]], collapse = '\n'))

  # here call your actual callback

  # return the value that knitr expects
  res
})