R Shiny:可用于许多 render*() 函数的 for 循环输出
R Shiny: The for loop output available for many render*() functions
我想做的是让 for 循环的输出 运行 可用于 Shiny App 中的许多渲染输出。
我创建了我的问题的简单示例。
每个 renderPrint() 函数中都有相同的 for 循环。
我能否以将 for 循环移到 render*() 函数之外的方式进行编码?
我找到了如何在循环中使用反应式的示例,但还没有找到解决逆向任务的方法。
感谢您的帮助和关注。
library(shiny)
ui <- fluidPage(sidebarLayout(
sidebarPanel(
numericInput(
inputId = "seed",
label = "Set seed:",
value = 1
),
numericInput(
inputId = "Number",
label = "Number:",
value = 1,
min = 1,
step = 1
)
),
mainPanel(
verbatimTextOutput("summary"),
dataTableOutput("table"),
verbatimTextOutput("data")
)
))
server <- function(input, output) {
a <- reactive({
set.seed(input$seed)
rnorm(input$Number, 2, 1)
})
b <- reactive({
5 * a()
})
rn <- reactive({
c(1:input$Number)
})
fun <- function(x, y) {
x + y
}
Table <- reactive({
data.frame(rn = rn(),
a = a(),
b = b())
})
output$table <- renderDataTable({
Table()
})
output$summary <- renderPrint({
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
})
output$data <- renderPrint({
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
})
}
shinyApp(ui = ui, server = server)
将 for 循环提取到一个函数中。您可以毫无问题地在函数中使用反应值,只要您不在反应性上下文之外调用该函数(render*
、reactive
、observe
)。
示例:
printTable <- function() {
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
}
output$summary <- renderPrint({
printTable()
})
output$data <- renderPrint({
printTable()
})
或者更有效,您可以将打印输出捕获为字符串并重新使用它:
capturedTableString <- reactive({
capture.output({
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
})
})
printTable <- function() {
cat(capturedTableString(), sep = "\n")
}
output$summary <- renderPrint({
printTable()
})
我想做的是让 for 循环的输出 运行 可用于 Shiny App 中的许多渲染输出。 我创建了我的问题的简单示例。 每个 renderPrint() 函数中都有相同的 for 循环。 我能否以将 for 循环移到 render*() 函数之外的方式进行编码?
我找到了如何在循环中使用反应式的示例,但还没有找到解决逆向任务的方法。 感谢您的帮助和关注。
library(shiny)
ui <- fluidPage(sidebarLayout(
sidebarPanel(
numericInput(
inputId = "seed",
label = "Set seed:",
value = 1
),
numericInput(
inputId = "Number",
label = "Number:",
value = 1,
min = 1,
step = 1
)
),
mainPanel(
verbatimTextOutput("summary"),
dataTableOutput("table"),
verbatimTextOutput("data")
)
))
server <- function(input, output) {
a <- reactive({
set.seed(input$seed)
rnorm(input$Number, 2, 1)
})
b <- reactive({
5 * a()
})
rn <- reactive({
c(1:input$Number)
})
fun <- function(x, y) {
x + y
}
Table <- reactive({
data.frame(rn = rn(),
a = a(),
b = b())
})
output$table <- renderDataTable({
Table()
})
output$summary <- renderPrint({
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
})
output$data <- renderPrint({
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
})
}
shinyApp(ui = ui, server = server)
将 for 循环提取到一个函数中。您可以毫无问题地在函数中使用反应值,只要您不在反应性上下文之外调用该函数(render*
、reactive
、observe
)。
示例:
printTable <- function() {
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
}
output$summary <- renderPrint({
printTable()
})
output$data <- renderPrint({
printTable()
})
或者更有效,您可以将打印输出捕获为字符串并重新使用它:
capturedTableString <- reactive({
capture.output({
for (i in Table()$rn) {
print (fun(Table()$a[i], Table()$b[i]))
}
})
})
printTable <- function() {
cat(capturedTableString(), sep = "\n")
}
output$summary <- renderPrint({
printTable()
})