存储在反应式语句中计算出的变量以用于hist()

时间:2019-09-05 08:55:23

标签: r shiny reactive

此问题是针对以下问题的后续措施

Display table and recompute one column based on sliders

我想在一个变量中捕获计算出的分数(仅呈现,而不是根据我的理解存储),以便每当计算出它时,我也可以更新关联的直方图。

这是我到目前为止的代码:

library(shiny)
#### INIT ####
x <- 1
y <- 0.5
z <- 2
df <- data.frame(
  a=1:10,
  b=10:1
)
df['score'] <- df[,x]^y + z
tmp <- reactiveVariable(score=df['score'])

#### UI ####
ui <- fluidPage(
  title = "Examples of DataTables",
  sidebarLayout(
    sidebarPanel(
      sliderInput("x", "x:",
                  min = 0, max = ncol(df),
                  value = 1),
      sliderInput("y", "y:",
                  min = 1, max = 10,
                  value = 1),
      sliderInput("z", "z:",
                  min = 1, max = 100,
                  value = 20),
      hr(),
      wellPanel(style="background:white",
      plotOutput("hist")
  )
    ),
    mainPanel(
      tabsetPanel(
        id = 'dataset',
        tabPanel("df", dataTableOutput("df"))
      )
    )
  )
)


#### SERVER ####
server <- function(input, output) {
  sliderValues <- reactive({
    df['score'] <- df[,input$x]^input$y + input$z
    tmp$score <- df['score']
    df
   })

  output$df <- renderDataTable(sliderValues())
  output$hist <- renderPlot(hist({tmp$score}))   
}

#### RUN #### 
shinyApp(ui = ui, server = server)

但是,这只会给我错误“ hist.default:'x'必须是数字”。 我究竟做错了什么?我以为保存到 reactiveVariable 变量会调用使用该变量的反应式函数(在这种情况下为直方图的呈现)。

1 个答案:

答案 0 :(得分:1)

几个问题。请从此开始

library(shiny)
#### INIT ####
df <- data.frame(
  a=1:10,
  b=10:1
)

#### UI ####
ui <- fluidPage(
  title = "Examples of DataTables",
  sidebarLayout(
    sidebarPanel(
      selectInput("x", "x:",names(df)),
      sliderInput("y", "y:",
                  min = 0, max = 10,step = 0.5,
                  value = 0.5),
      sliderInput("z", "z:",
                  min = 1, max = 100,
                  value = 2),
      hr(),
      wellPanel(style="background:white",
                plotOutput("hist")
      )
    ),
    mainPanel(
      dataTableOutput("df")
    )
  )

)

#### SERVER ####
server <- function(input, output) {

  sliderValues <- reactive({
    df$score <- df[,input$x]^input$y + input$z
    df
  })

  output$df <- renderDataTable({sliderValues()})
  output$hist <- renderPlot({
    hist(sliderValues()$score)})   
}

#### RUN #### 
shinyApp(ui = ui, server = server)