我已经为闪亮应用程序设置了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