运行 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)
我正在使用 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 (
在非交互式 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)