Shiny 每次按下按钮都会生成随机值
Shiny generate random values every time press button
我是 shiny 的新手,我做的是简单的 shiny 应用程序,它生成 iid 正态变量并打印直方图。
输入有:
- 2 个数字输入字段,mu 和 sigma
- 动作按钮
输出为 tabsetPanel:
- Tab1: 5 个生成值
- 选项卡 2:直方图
所以它不起作用。我尝试了很多变体,但唯一不够有效的解决方案是这个。
这是代码ui.R
library(shiny)
library(xtable)
meanInput1 <- numericInput("id1", "$$mean \ of \ x_1$$", 1, min = -10, max = 10, step = 1)
meanInput2 <- numericInput("id2", "$$sd \ of \ x_2$$", 1, min = -10, max = 10, step = 1)
tabPanel1 <- tabPanel("generated values", tableOutput("table1"))
tabPanel2 <- tabPanel("Plot", plotOutput("plot1"))
shinyUI(fluidPage(
withMathJax(),
titlePanel("title"),
sidebarLayout(
fluid=TRUE,
sidebarPanel(
meanInput1,
meanInput2,
actionButton("goButton", "Go!")
),
mainPanel(
tabsetPanel(
tabPanel1,
tabPanel2
)
)
)))
这是代码server.R
shinyServer(
function(input, output) {
output$plot1 <- renderPlot({
if (input$goButton >= 1){
sigma <- input$id2
muInput <- input$id1
table <- as.data.frame(rnorm(n = 5,muInput,sd = sigma))
names(table) <- "x"
output$plot1 <- renderPlot(hist(table));
output$table1 <- renderTable(head(table));
}
})
}
)
问题:
- 仅当按钮单击 一次 并且选择了 tabPanel2 时才有效。如何让它在我每次单击按钮时都起作用。
你想在这种情况下使用 eventReactive
。您可以找到使用 actionButton
here 的演示。您的代码结构也有些奇怪,渲染语句中包含渲染语句。
如果您创建 eventReactive
函数并将 renderTable
和 renderPlot
调用分开,它会更清晰并且可以正常工作。最好不要将变量命名为与函数相同的名称,因此为了清楚起见,我将 table
变量更改为 my_table
。
shinyServer(
function(input, output) {
rand <- eventReactive(input$goButton,{
sigma <- input$id2
muInput <- input$id1
my_table <- as.data.frame(rnorm(n = 5,muInput,sd = sigma))
names(my_table) <- "x"
return(my_table)
})
output$plot1 <- renderPlot({
my_table <- rand()
if(is.null(my_table)){
return(NULL)
}else{
hist(head(my_table$x));
}
})
output$table1 <- renderTable({
my_table <- rand()
if(is.null(my_table)){
return(NULL)
}else{
my_table
}
});
}
)
我是 shiny 的新手,我做的是简单的 shiny 应用程序,它生成 iid 正态变量并打印直方图。 输入有:
- 2 个数字输入字段,mu 和 sigma
- 动作按钮
输出为 tabsetPanel:
- Tab1: 5 个生成值
- 选项卡 2:直方图
所以它不起作用。我尝试了很多变体,但唯一不够有效的解决方案是这个。
这是代码ui.R
library(shiny)
library(xtable)
meanInput1 <- numericInput("id1", "$$mean \ of \ x_1$$", 1, min = -10, max = 10, step = 1)
meanInput2 <- numericInput("id2", "$$sd \ of \ x_2$$", 1, min = -10, max = 10, step = 1)
tabPanel1 <- tabPanel("generated values", tableOutput("table1"))
tabPanel2 <- tabPanel("Plot", plotOutput("plot1"))
shinyUI(fluidPage(
withMathJax(),
titlePanel("title"),
sidebarLayout(
fluid=TRUE,
sidebarPanel(
meanInput1,
meanInput2,
actionButton("goButton", "Go!")
),
mainPanel(
tabsetPanel(
tabPanel1,
tabPanel2
)
)
)))
这是代码server.R
shinyServer(
function(input, output) {
output$plot1 <- renderPlot({
if (input$goButton >= 1){
sigma <- input$id2
muInput <- input$id1
table <- as.data.frame(rnorm(n = 5,muInput,sd = sigma))
names(table) <- "x"
output$plot1 <- renderPlot(hist(table));
output$table1 <- renderTable(head(table));
}
})
}
)
问题:
- 仅当按钮单击 一次 并且选择了 tabPanel2 时才有效。如何让它在我每次单击按钮时都起作用。
你想在这种情况下使用 eventReactive
。您可以找到使用 actionButton
here 的演示。您的代码结构也有些奇怪,渲染语句中包含渲染语句。
如果您创建 eventReactive
函数并将 renderTable
和 renderPlot
调用分开,它会更清晰并且可以正常工作。最好不要将变量命名为与函数相同的名称,因此为了清楚起见,我将 table
变量更改为 my_table
。
shinyServer(
function(input, output) {
rand <- eventReactive(input$goButton,{
sigma <- input$id2
muInput <- input$id1
my_table <- as.data.frame(rnorm(n = 5,muInput,sd = sigma))
names(my_table) <- "x"
return(my_table)
})
output$plot1 <- renderPlot({
my_table <- rand()
if(is.null(my_table)){
return(NULL)
}else{
hist(head(my_table$x));
}
})
output$table1 <- renderTable({
my_table <- rand()
if(is.null(my_table)){
return(NULL)
}else{
my_table
}
});
}
)