I have set up a ui and server for a shiny app. I also have a data frame my set of variables. I am trying to loop through the rows dataframe using if statements to match my selected inputs to the columns in the data frame. Then return the value in the last column (result/score).
I have recreated a smaller simplified version of the code and dataset for this post.
I have tried to use filters to filter out the criteria in the data frame and return the value that I want. I have also tried just using if statements on their own but to no avail.
My dataset has a larger number of columns and rows than the one created below but for simplicity:
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})
})
I expect to have the corresponding resultant score showing up in the main panel of the app, which updates depending on the selected inputs. Currently I find that I am getting no output at all.
Any help would be greatly appreciated.
I am not sure, but are you trying to do the following (see code below). In this case you do not need a for loop.
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