首页 > 解决方案 > R Shiny App 中的简单计算提供了与 Rstudio 中相同计算不同的输出

问题描述

在我的 Shiny App 中,我有三个输入。selectInput()用户想要选择文章的地方;textInput()用户想要指定股票的地方;触发. actionButton()_ tableOutput()tableOutput()为用户提供了一个数据框,其中包含与过滤器匹配的数据框中的第一个条目。

例如:用户想知道他选择的文章在他选择selectInput()的股票中是在哪一周textInput()。所以他选择了这篇文章34343并想知道这篇文章什么时候34343有 100 的可用库存。输出将给他第 1 周的答案,因为有 210.57 的可用库存。

我在这里面临的问题是,当我指定大于 210,57 的股票时,例如 211,预期的一周将是第 3 周,但输出显示其第 2 周的股票为 94.42,这基本上意味着 94.42大于 210.57。

怎么会这样?

library(shiny)
library(tidyverse)

df = tibble(id=as.integer(c(34343, 34343, 34343)), week=as.integer(c(1,2,3)), stock=as.double(c(210.57,94.42,412.31)))

ui <- fluidPage(

    selectInput(inputId = "id", "Select", choices = df$id, multiple = F, selectize = T),
    textInput(inputId = "stock", "Stock", placeholder = "i.e. 100"),
    actionButton(inputId = "click", "Click"),
    tableOutput(outputId = "table")
)

server <- function(input, output) {

    result = eventReactive(input$click, {
        df %>% filter(id %in% input$id) %>% 
            distinct(id, week, stock) %>%
            group_by(id) %>%
            slice(first(which(stock >= input$stock)))
    })
    
    output$table = renderTable({
        result()
    })
}
# Run the application 
shinyApp(ui = ui, server = server)

标签: rshiny

解决方案


您的slice()陈述必须是:

slice(first(which(stock >= as.numeric(input$stock))))

因为input$stock是一个不会自动转换为数字的字符串。考虑这两个不同的过滤器语句是如何工作的:

> filter(df, stock >= "212")
# # A tibble: 2 x 3
#      id  week stock
#   <int> <int> <dbl>
# 1 34343     2  94.4
# 2 34343     3 412. 
> filter(df, stock >= 212)
# # A tibble: 1 x 3
#        id  week stock
#     <int> <int> <dbl>
# 1 34343     3  412.

下面的代码产生预期的输出。

library(shiny)
library(tidyverse)

df = tibble(id=as.integer(c(34343, 34343, 34343)), week=as.integer(c(1,2,3)), stock=as.double(c(210.57,94.42,412.31)))

ui <- fluidPage(
  selectInput(inputId = "id", "Select", choices = df$id, multiple = F, selectize = T),
  textInput(inputId = "stock", "Stock", placeholder = "i.e. 100"),
  actionButton(inputId = "click", "Click"),
  tableOutput(outputId = "table")
)

server <- function(input, output) {

  result = eventReactive(input$click, {
    df %>% filter(id %in% input$id) %>% 
      distinct(id, week, stock) %>%
      group_by(id) %>%
      slice(first(which(stock >= as.numeric(input$stock))))
  })
  
  output$table = renderTable({
    result()
  })
}
# Run the application 
shinyApp(ui = ui, server = server)

推荐阅读