运行 knitr 文档中需要用户交互的函数

Run a function that requires user interaction in a knitr document

我正在使用 Knitr 包在 Latex 中编写报告。我在代码片段中编写了以下函数:

sum <- function(){
  n <- as.numeric(readline("Enter any positive integer"))
  i <- 1:n; s <- sum(i)
  return(s)
}

当我在 Latex 文档中执行它时:

<<>>
sum()
@

我收到此错误:

## Enter any positive integer ## 
Error in 1:n: NA/NaN argument

如何修复代码段?

为了能够交互式输入任何内容,readline() 必须在 interactive R 会话中使用,但是您的 Rnw 文档是在非交互式 R 中编译的session ()---这只是我的猜测,因为你没有提到你是如何编译文档的,大多数人可能会点击 RStudio 中的“Knit”按钮,这意味着文档是在一个单独的非交互式 R 会话。

在非交互式 R 会话中,readline() 不允许交互式输入,并且立即 returns "",这会导致您看到的错误:

> 1:""
Error in 1:"" : NA/NaN argument

如果您有任何需要人工交互的代码(例如输入数字),文档必须在交互式 R 会话中编译,方法是 运行 knitr::knit('your-document.Rnw') 在 R 控制台中。 (对于 R Markdown 用户,运行 rmarkdown::render() 代替。)

就是说,我不建议将需要交互的代码放在 knitr 文档中,因为这会使重现变得更加困难(结果取决于交互输入,这是不可预测的)。

您可以定义您的函数,使其绝对不需要人工交互,例如,

sum2 <- function(n = as.numeric(readline("Enter any positive integer"))) {
  i <- 1:n; s <- sum(i)
  return(s)
}

然后如果你想在非交互式 R 会话中调用该函数,你可以将一个值传递给参数 n,例如,

sum2(10)