我正在使用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中运行块并通过控制台获取用户输入并将其打印得很好。它也作为字符串存储在全局环境中。然而,当我编织文档时,我得到以下结果:
似乎在编织文档时我无法打印用户输入字符串...
对此的任何帮助将不胜感激。
答案 0 :(得分:1)
正如Nathan在评论中所说,您无法使用readline
在knitr
文档中获取输入,因为它不是交互式的。但您可以使用"参数化报告"来获取用户输入。 (见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}}输出到控制台。
想象一下以下设置:
message()
(方法不适用于Rstudio的“编织”按钮或从不支持图形的对象进行渲染时),并且想要(在某些情况下)干预中间渲染。下面的示例使用一个标志来继续或重新创建数据,如果的平均值高于/低于某个阈值,但这可以是您可能想要设置的任何触发用户输入的标志。
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,因此系统会提示您:
我不确定在某些情况下应该使用这种方法。对于大多数此类问题,最好设计出可靠的解决方案,并通过dat_mean
中的params
参数输入。
您最终可能会采用这种方法的可能情况是,如果您的外部数据源不完全可靠,并且应该采取的措施不清楚,或者您想在继续之前检查一下,并且(出于某种原因) ),您希望在渲染Rmd的过程中发生这种情况(而不是在启动之前)...