如何使用用于循环的数据框架返回一个值,以及IF与Shiny Server中的输入值匹配



我已经为闪亮应用程序设置了UI和服务器。我也有一个数据框架我的一组变量。我正在尝试使用IF语句循环浏览行数据框,以将我所选的输入与数据框中的列匹配。然后在最后一列中返回值(结果/得分(。

我已经为本文重新创建了较小的代码和数据集的简化版本。

我试图使用过滤器来过滤数据框中的标准并返回我想要的值。我还尝试过自己使用if语句,但无济于事。

我的数据集比下面创建的列数量和行更大,但为简单起见:

 z <-  c("Perfect", "Edible", "Spoiled", "Perfect", "Edible",  "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled")
 y <-  c("Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable", "Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable", "Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable", "Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable")
x <-  c("A", "A","A","A","A","A", "B", "B", "B", "B", "B", "B", "C", "C","C","C","C","C", "D", "D","D","D","D","D")
result  <- runif(24, 50, 500)

ui.r:

    library("shiny")    
    shinyUI(
    pageWithSidebar(
    headerPanel("Demo")
    ,
    sidebarPanel(
    wellPanel(
    selectInput(
         inputId= 'x', 
         label= "Country of Origin", 
         choices= list('A', 'B', 'C', 'D'),
         selected='A',
         multiple= FALSE),
    selectInput(
          inputId= 'y', 
          label= "Product",
          choices= list("Fruit", "Vegetable"),
          selected='Fruit',
          multiple= FALSE),
    selectInput(
          inputId= 'z',
          label= "Quality",
          choices = list("Perfect", "Edible", "Spoiled"),
          multiple= FALSE)
  )
)
,
mainPanel(
    wellPanel(
          textOutput("score")))))

server.r:

  shinyServer(
  function(input,output,session){
   score <- reactive({
     for (row in 1:nrow(df())) {
     if(input$x == df$x[row] && input$y == df$y[row] && input$z == df$z){
   score$result <- df$result[row] 
       }
      }
     })
output$score <- renderText({
score$result})  
   })

我希望在应用程序的主面板中显示相应的结果分数,该分数根据所选输入而更新。目前,我发现我根本没有输出。

任何帮助将不胜感激。

我不确定,但是您是否尝试执行以下操作(请参见下面的代码(。在这种情况下,您不需要循环。

library("shiny")
library("dplyr")
z <-  c("Perfect", "Edible", "Spoiled", "Perfect", "Edible",  "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled", "Perfect", "Edible", "Spoiled")
y <-  c("Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable", "Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable", "Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable", "Fruit", "Fruit", "Fruit","Vegetable", "Vegetable", "Vegetable")
x <-  c("A", "A","A","A","A","A", "B", "B", "B", "B", "B", "B", "C", "C","C","C","C","C", "D", "D","D","D","D","D")
df = data.frame(x, y, z, result = runif(24, 50, 500), stringsAsFactors = FALSE)
shinyApp(
    ui =  shinyUI(
        pageWithSidebar(
            headerPanel("Demo")
            ,
            sidebarPanel(
                wellPanel(
                    selectInput(
                        inputId= 'x', 
                        label= "Country of Origin", 
                        choices= list('A', 'B', 'C', 'D'),
                        selected='A',
                        multiple= FALSE),
                    selectInput(
                        inputId= 'y', 
                        label= "Product",
                        choices= list("Fruit", "Vegetable"),
                        selected='Fruit',
                        multiple= FALSE),
                    selectInput(
                        inputId= 'z',
                        label= "Quality",
                        choices = list("Perfect", "Edible", "Spoiled"),
                        multiple= FALSE)
                )
            )
            ,
            mainPanel(
                wellPanel(
                    textOutput("score"))))),
    # Server ------
    server = function(input, output, session){
                score <- reactive({
                    df %>% 
                        filter(x == input$x,
                               y == input$y,
                               z == input$z)
                })
                output$score <- renderText({
                    score()$result
                    })
    }        
) # Closes ShinyApp

最新更新