Shiny:Shiny App 中的 RMarkdown If 语句
Shiny: RMarkdown If-statement inside Shiny App
我很难弄清楚如何在 .Rmd 文件中使用 if 语句。我在 Whosebug 上找不到任何东西...
我将以这个闪亮的应用程序为例进行解释:
library(shiny)
library(markdown)
library(knitr)
server <- function(input, output) {
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd', overwrite = TRUE)
out <- rmarkdown::render('report.Rmd',
params = list(text = input$text),
switch(input$format,
PDF = pdf_document(),
HTML = html_document(),
Word = word_document()
))
file.rename(out, file)
}
)
}
ui <- fluidPage(
tags$textarea(id="text", rows=20, cols=155,
placeholder="Some placeholder text"),
tabPanel("Data",
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE),
conditionalPanel(
condition = "input.filter == '1'",
column(6,
h4("WerkstoffNr auswaehlen:"),
selectInput("select", " ",
choices = seq(1,100,10))),
column(6,
h4("Abmessung auswaehlen:"),
selectInput("abmfrom", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto", "Bis:",choices=as.list(seq(20,110,10))),
actionButton("button1", "Auswaehlen"))),
conditionalPanel(
condition = "input.filter == '2' ",
column(6,h4("S-Gehalt auswaehlen:"),
selectInput("sgehalt", "Von:",choices=seq(1,100,10)),
selectInput("sgehalt2", "Bis:",choices=seq(1,100,10))),
column(6,h4("Abmessung auswaehlen:"),
selectInput("abmfrom2", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto2", "Bis:",choices=as.list(seq(20,110,10)))))
),
flowLayout(radioButtons('format', 'Document format', c('PDF','HTML', 'Word'),
inline = TRUE),
downloadButton('downloadReport'))
)
shinyApp(ui = ui, server = server)
report.Rmd(目前就是这样):
---
title: "Parameterized Report for Shiny"
output: html_document
params:
text: 'NULL'
---
# Some title
`r params[["text"]]`
我想在我的 RMarkdown 报告中获取来自这部分闪亮应用的输入:
tabPanel("Data",
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE),
conditionalPanel(
condition = "input.filter == '1'",
column(6,
h4("WerkstoffNr auswaehlen:"),
selectInput("select", " ",
choices = seq(1,100,10))),
column(6,
h4("Abmessung auswaehlen:"),
selectInput("abmfrom", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto", "Bis:",choices=as.list(seq(20,110,10))),
actionButton("button1", "Auswaehlen"))),
conditionalPanel(
condition = "input.filter == '2' ",
column(6,h4("S-Gehalt auswaehlen:"),
selectInput("sgehalt", "Von:",choices=seq(1,100,10)),
selectInput("sgehalt2", "Bis:",choices=seq(1,100,10))),
column(6,h4("Abmessung auswaehlen:"),
selectInput("abmfrom2", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto2", "Bis:",choices=as.list(seq(20,110,10)))))
)
我们可以看到里面有一个If语句(关于过滤选项)。因此,这取决于用户希望使用哪个选项来过滤数据。我希望在我的报告中包含此选项。随便点个赞:
if input.filter == 1
Werkstoffnummer: input$select
Abmessung: von input$abmfrom bis input$abmto
else
S : von sgehalt bis sgehalt2
Abmessung: von input$abmfrom2 bis input$abmto2
所以在报告中只会打印(如果input.filter ==1):
工号:1
Abmessung: von 20 bis 30
非常感谢!
可能我不完全理解你,但你可以使用类似
(示例打印不同的文本坚持输入过滤器)
---
title: "Untitled"
runtime: shiny
output: html_document
---
```{r eruptions, echo=FALSE}
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE)
conditionalPanel(
condition = "input.filter == '1'",
column(6,
h4("WerkstoffNr auswaehlen:")
))
conditionalPanel(
condition = "input.filter == '2' ",
column(6,h4("S-Gehalt auswaehlen:")))
```
或使用服务器端(渲染 UI ,如 here )
但您不能像静态 html 文件一样共享它:
*"Note: If you are familiar with R Markdown, you might expect RStudio to save an HTML version of an interactive document in your working directory. However, this only works with static HTML documents. Each interactive document must be served by a computer that manages the document. As a result, interactive documents cannot be shared as a standalone HTML file."
更新
如果你想下载静态的html
示例
report.rmd
---
title: "Untitled"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r ,echo=FALSE}
if(input$filter==1){
h1(paste("1",input$ii))
}else{
h1(paste("2",input$ii))
}
```
闪亮
library(shiny)
ui=shinyUI(fluidPage(
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE),
numericInput("ii","1",0),
downloadButton('downloadReport')
))
server=shinyServer(function(input, output) {
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', 'html' )
},
content = function(file) {
src <- normalizePath('report.Rmd')
# temporarily switch to the temp dir, in case you do not have write
# permission to the current working directory
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd')
library(rmarkdown)
out <- render('report.Rmd', html_document())
file.rename(out, file)
}
)
})
shinyApp(ui,server )
报告将包含 1 或 2 个单选按钮和 ii 输入
听起来你想要的是一个模板来生成报告。 R Markdown 是一种用于漂亮打印报告而不是生成报告的格式。
对于报告生成,有 ‹brew›。它允许您使用简单的模板语言生成任何文件(包括 R Markdown)。在您的情况下,您可以执行以下操作:
<% if (input.filter == 1) { %>
… normal R Markdown code here!
<% } %>
将其另存为 report.rmd.brew
或类似名称;然后,在您的报告生成代码中,您需要在呈现之前 brew
模板:
brew::brew('report.rmd.brew', 'report.rmd')
默认从当前环境中查找变量(可配置)
我很难弄清楚如何在 .Rmd 文件中使用 if 语句。我在 Whosebug 上找不到任何东西...
我将以这个闪亮的应用程序为例进行解释:
library(shiny)
library(markdown)
library(knitr)
server <- function(input, output) {
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd', overwrite = TRUE)
out <- rmarkdown::render('report.Rmd',
params = list(text = input$text),
switch(input$format,
PDF = pdf_document(),
HTML = html_document(),
Word = word_document()
))
file.rename(out, file)
}
)
}
ui <- fluidPage(
tags$textarea(id="text", rows=20, cols=155,
placeholder="Some placeholder text"),
tabPanel("Data",
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE),
conditionalPanel(
condition = "input.filter == '1'",
column(6,
h4("WerkstoffNr auswaehlen:"),
selectInput("select", " ",
choices = seq(1,100,10))),
column(6,
h4("Abmessung auswaehlen:"),
selectInput("abmfrom", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto", "Bis:",choices=as.list(seq(20,110,10))),
actionButton("button1", "Auswaehlen"))),
conditionalPanel(
condition = "input.filter == '2' ",
column(6,h4("S-Gehalt auswaehlen:"),
selectInput("sgehalt", "Von:",choices=seq(1,100,10)),
selectInput("sgehalt2", "Bis:",choices=seq(1,100,10))),
column(6,h4("Abmessung auswaehlen:"),
selectInput("abmfrom2", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto2", "Bis:",choices=as.list(seq(20,110,10)))))
),
flowLayout(radioButtons('format', 'Document format', c('PDF','HTML', 'Word'),
inline = TRUE),
downloadButton('downloadReport'))
)
shinyApp(ui = ui, server = server)
report.Rmd(目前就是这样):
---
title: "Parameterized Report for Shiny"
output: html_document
params:
text: 'NULL'
---
# Some title
`r params[["text"]]`
我想在我的 RMarkdown 报告中获取来自这部分闪亮应用的输入:
tabPanel("Data",
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE),
conditionalPanel(
condition = "input.filter == '1'",
column(6,
h4("WerkstoffNr auswaehlen:"),
selectInput("select", " ",
choices = seq(1,100,10))),
column(6,
h4("Abmessung auswaehlen:"),
selectInput("abmfrom", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto", "Bis:",choices=as.list(seq(20,110,10))),
actionButton("button1", "Auswaehlen"))),
conditionalPanel(
condition = "input.filter == '2' ",
column(6,h4("S-Gehalt auswaehlen:"),
selectInput("sgehalt", "Von:",choices=seq(1,100,10)),
selectInput("sgehalt2", "Bis:",choices=seq(1,100,10))),
column(6,h4("Abmessung auswaehlen:"),
selectInput("abmfrom2", "Von:",choices=as.list(seq(20,110,10))),
selectInput("abmto2", "Bis:",choices=as.list(seq(20,110,10)))))
)
我们可以看到里面有一个If语句(关于过滤选项)。因此,这取决于用户希望使用哪个选项来过滤数据。我希望在我的报告中包含此选项。随便点个赞:
if input.filter == 1
Werkstoffnummer: input$select
Abmessung: von input$abmfrom bis input$abmto
else
S : von sgehalt bis sgehalt2
Abmessung: von input$abmfrom2 bis input$abmto2
所以在报告中只会打印(如果input.filter ==1):
工号:1
Abmessung: von 20 bis 30
非常感谢!
可能我不完全理解你,但你可以使用类似 (示例打印不同的文本坚持输入过滤器)
---
title: "Untitled"
runtime: shiny
output: html_document
---
```{r eruptions, echo=FALSE}
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE)
conditionalPanel(
condition = "input.filter == '1'",
column(6,
h4("WerkstoffNr auswaehlen:")
))
conditionalPanel(
condition = "input.filter == '2' ",
column(6,h4("S-Gehalt auswaehlen:")))
```
或使用服务器端(渲染 UI ,如 here )
但您不能像静态 html 文件一样共享它:
*"Note: If you are familiar with R Markdown, you might expect RStudio to save an HTML version of an interactive document in your working directory. However, this only works with static HTML documents. Each interactive document must be served by a computer that manages the document. As a result, interactive documents cannot be shared as a standalone HTML file."
更新
如果你想下载静态的html 示例
report.rmd
---
title: "Untitled"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r ,echo=FALSE}
if(input$filter==1){
h1(paste("1",input$ii))
}else{
h1(paste("2",input$ii))
}
```
闪亮
library(shiny)
ui=shinyUI(fluidPage(
radioButtons('filter', h3(strong("Auswahlkriterien:")),
choices = list("WerkstoffNr" = 1,
"S-Gehalt" = 2),
selected = 1,inline=TRUE),
numericInput("ii","1",0),
downloadButton('downloadReport')
))
server=shinyServer(function(input, output) {
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', 'html' )
},
content = function(file) {
src <- normalizePath('report.Rmd')
# temporarily switch to the temp dir, in case you do not have write
# permission to the current working directory
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd')
library(rmarkdown)
out <- render('report.Rmd', html_document())
file.rename(out, file)
}
)
})
shinyApp(ui,server )
报告将包含 1 或 2 个单选按钮和 ii 输入
听起来你想要的是一个模板来生成报告。 R Markdown 是一种用于漂亮打印报告而不是生成报告的格式。
对于报告生成,有 ‹brew›。它允许您使用简单的模板语言生成任何文件(包括 R Markdown)。在您的情况下,您可以执行以下操作:
<% if (input.filter == 1) { %>
… normal R Markdown code here!
<% } %>
将其另存为 report.rmd.brew
或类似名称;然后,在您的报告生成代码中,您需要在呈现之前 brew
模板:
brew::brew('report.rmd.brew', 'report.rmd')
默认从当前环境中查找变量(可配置)