我认为我在Shiny应用程序中缺少与被动反应相关的内容。这是一个MRE,显示我的问题是打印y
。
library(shiny)
ui <- fluidPage(
titlePanel("Test"),
textAreaInput("text", "Text", "", width = "400px"),
verbatimTextOutput("text"),
actionButton("do", "Run"),
textOutput("result")
)
server <- function(input, output) {
observeEvent(input$do, {
y <- reactive({
x <- ""
t <- 1
while (t < 5) {
x <- paste(input$text, x, sep=",")
t <- t + 1
}
})
})
output$result <- renderPrint({y})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:4)
您不应在CamelFileName
或observeEvent
电话中加入无效值。实际上,Joe Cheng建议不要将observe
或observe
函数嵌套在其自身或其他内容中。它们是用于不同目的的独立物品。由于您希望根据点击reactive
的时间创建被动y
,因此您应该使用input$do
:
eventReactive
我将server <- function(input, output) {
y <- eventReactive(input$do, {
x <- ""
t <- 1
while (t < 5) {
x <- paste(input$text, x, sep=",")
t <- t + 1
}
return(x)
})
output$result <- renderText({y()})
}
更改为renderPrint()
,以便显示所需的输出。此外,由于renderText()
是被动的,因此您需要在y
来电中添加y()
。我还在renderText()
电话中添加了return(x)
,否则eventReactive
将是返回的值。
答案 1 :(得分:1)
我的问题是你对reactive()
的调用没有返回任何内容。在reactive
中包装表达式会在每次更改表达式中的反应值时将表达式的返回值分配给变量。反应值通常是input$...
个变量,以及存储在reactiveValues()
个对象中的变量。
如果我说得对,你想在每次&#34;运行时更改并打印y
。按钮被击中。将其保存到reactiveValue()
集合(类似于列表可访问),然后将其放在renderPrint
函数中。
在您的代码中,我认为您希望y
在while循环之后成为x
的值。
library(shiny)
ui <- fluidPage(
titlePanel("Test"),
textAreaInput("text", "Text", "", width = "400px"),
verbatimTextOutput("text"),
actionButton("do", "Run"),
textOutput("result")
)
server <- function(input, output) {
values <- reactiveValues()
observeEvent(input$do, {
x <- ""
t <- 1
while (t < 5) {
x <- paste(input$text, x, sep=",")
t <- t + 1
}
values$y <- x
})
output$result <- renderPrint({values$y})
}
shinyApp(ui = ui, server = server)