knitr用户输入

时间:2017-08-25 19:53:53

标签: r knitr r-markdown

我正在使用R markdown和Knitr使用Rstudio。

我有以下R降价文件:

reduce (tostream|select(length==2)) as [$p,$v] (
  .
; if $p[-1] == "datasource" and $v == null then setpath($p; "mydb") else . end
)

代码会询问用户网站名称和号码。我可以在R markdown中运行块并通过控制台获取用户输入并将其打印得很好。它也作为字符串存储在全局环境中。然而,当我编织文档时,我得到以下结果:

enter image description here

似乎在编织文档时我无法打印用户输入字符串...

对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

正如Nathan在评论中所说,您无法使用readlineknitr文档中获取输入,因为它不是交互式的。但您可以使用"参数化报告"来获取用户输入。 (见http://rmarkdown.rstudio.com/developer_parameterized_reports.html)。例如,

---
title: "Untitled"
author: ""
date: ""
output: html_document
params: 
  prjName: "The project name"
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r}
readname = function()# Get the project name
{ 
  params$prjName
}
prjName=readname()
prjName

如果您只是编织此文档,它会将prjName设置为"项目名称"。如果你点击"用参数编织" (或在params = "ask"的通话中设置rmarkdown::render),系统会提示您输入该值,并将其作为默认值。

答案 1 :(得分:0)

参数化的报告(请参阅先前的答案)有助于在渲染之前设置变量,并且是一种比以下描述的方法更好的实践(在大多数情况下,由于缺乏可重复性,应避免使用该方法) 。但是,如果(出于某种原因)希望通过提示的Rmd部分提示用户输入数据,则可以将utils::menu()graphics = TRUE搭配信息丰富的warning()或{{ 1}}输出到控制台。

想象一下以下设置:

  • 您正在从IDE中手动启动message()(方法不适用于Rstudio的“编织”按钮或从不支持图形的对象进行渲染时),并且想要(在某些情况下)干预中间渲染。
  • 您的工作流程取决于外部数据或某些随机或不一致的过程(并且只能在运行Rmd的过程中得到部分解决)

下面的示例使用一个标志来继续或重新创建数据,如果的平均值高于/低于某个阈值,但这可以是您可能想要设置的任何触发用户输入的标志。

rmarkdown::render()

想象一下,上面的代码块代表一个名为“ test-file.Rmd”的Rmd文档。通过 --- title: "Using menu() in an Rmd" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE) ``` ```{r initial-values-and-parameters} cut_point_mean <- 0.35 set.seed(12) data <- runif(1:10) ``` ```{r initial-parameters} (dat_mean <- mean(data)) (wait_to_proceed <- dat_mean < cut_point_mean) num_retry <- 0 ``` ```{r while-loop-check-distribution} while(wait_to_proceed){ warning(paste("Mean of data is:", dat_mean, "\nThis is greater than cut_point of:", cut_point_mean, "\ndo you want to proceed to plotting or resample data?"), immediate. = TRUE) switch(menu(choices = c("Yes, proceed to plotting.", "No, resample output."), graphics = TRUE, title = "Read warning(s) on console before making selection") + 1, stop("User must make a selection.\n"), wait_to_proceed <- FALSE, num_retry <- num_retry + 1 ) if(wait_to_proceed){ data <- runif(1:10) dat_mean <- mean(data) wait_to_proceed <- dat_mean < cut_point_mean } } ``` ```{r} print(paste("Number of times data regenerated:", num_retry)) print(dat_mean) ``` ```{r} plot(data) ``` 渲染后,rmarkdown::render("test-file.Rmd")的初始值为〜0.32,因此系统会提示您:

enter image description here

我不确定在某些情况下应该使用这种方法。对于大多数此类问题,最好设计出可靠的解决方案,并通过dat_mean中的params参数输入。

您最终可能会采用这种方法的可能情况是,如果您的外部数据源不完全可靠,并且应该采取的措施不清楚,或者您想在继续之前检查一下,并且(出于某种原因) ),您希望在渲染Rmd的过程中发生这种情况(而不是在启动之前)...