【问题标题】:knitr with user input带有用户输入的 knitr
【发布时间】:2018-02-03 22:15:20
【问题描述】:

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

我有以下 R 降价文件:

---
title: "Untitled"
author: ""
date: ""
output: html_document
---

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

```{r}
#Load libraries
library(knitr)
library(ggplot2)
library(reshape2)
library(chron)
library(gridExtra)

#Get current directory
directory = getwd()
setwd(directory)

readname = function()#prompt user for the name and number of the site
{ 
  n <- readline(prompt="Site name and number: ")
  return(n)
}
prjName=readname()
print(prjName)
prjName2="TEST NAME"
prjName2

代码要求用户提供站点名称和编号。我可以在 R markdown 中运行该块并通过控制台获取用户输入并打印它就好了。它也在全局环境中存储为字符串。然而,当我编织文档时,我得到以下结果:

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

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

【问题讨论】:

  • 所以你有print(prjName),然后只有prjName2..prjName(没有print)呢?
  • 有趣,在 RStudio 中运行它我什至没有机会输入任何东西,它只是完成编织
  • 我猜你正在使用 R Studio 的“编织”功能。这会在非交互式会话中呈现文档,这意味着 readline 函数不会要求输入。它总是只返回""
  • prjName 或 print(prjName) 都不会产生任何结果。我正在使用“编织”功能。我曾计划让用户在 R markdown 文件中运行脚本,系统会提示他们在控制台中输入名称(和其他内容),然后再编织文档。因此,运行脚本以获取我需要的所有用户输入,然后运行 ​​knit 并生成报告。

标签: r knitr r-markdown


【解决方案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 设置为“项目名称”。如果您单击“使用参数编织”(或在对 rmarkdown::render 的调用中设置 params = "ask"),系统将提示您输入该值,并将其作为默认值。

【讨论】:

    【解决方案2】:

    参数化报告(参见之前的答案)有助于在渲染之前设置变量,并且是一种比下面描述的方法更好的做法(在大多数情况下,由于缺乏可重复性,应该避免这种方法) .但是,如果(出于某种原因)您希望在渲染 Rmd 的过程中提示用户输入数据,您可以使用 utils::menu()graphics = TRUE 与信息性 warning()message() 输出到控制台。

    想象一下以下设置:

    • 您正在从 IDE 手动启动 rmarkdown::render()(该方法不适用于 Rstudio 的 knit 按钮或从不支持图形的任何内容进行渲染时)并且想要(在某些情况下)干预中间渲染。
    • 您的工作流程依赖于外部数据或一些随机或不一致的过程(并且只能通过运行 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)
        ```
    

    想象上面的代码块代表一个名为“test-file.Rmd”的 Rmd 文档。在通过rmarkdown::render("test-file.Rmd") 渲染后,dat_mean 的初始值将是 ~0.32,因此系统会提示您:

    我不确定在某些情况下您应该使用这种方法。对于像这样的大多数问题,最好制定一个可靠的解决方案并通过rmarkdown::render() 中的params 参数输入。

    您最终采用这种方法的一种潜在情况可能是,如果您有一个不完全可靠的外部数据源,并且您应该采取的操作不清楚,或者您想在继续之前检查某些内容并且(出于某种原因) 你希望在渲染 Rmd 的中途发生这种情况(而不是在启动它之前)...

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 2017-10-05
      • 2015-05-19
      • 2017-07-30
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多