shiny - 如何使用 for 循环和 ifs 从数据框中返回值以匹配闪亮服务器中的输入值
问题描述
我已经为闪亮的应用程序设置了 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)
用户界面:
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")))))
服务器.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})
})
我希望相应的结果分数会显示在应用程序的主面板中,该面板会根据所选输入进行更新。目前我发现我根本没有得到任何输出。
任何帮助将不胜感激。
解决方案
我不确定,但您是否尝试执行以下操作(请参见下面的代码)。在这种情况下,您不需要 for 循环。
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
推荐阅读
- python - 水波纹效果 Python 和 Pygame,来自编码火车视频
- javascript - 如何在没有循环的数组中找到匹配字符串
- mongodb - JHipster - 如何在 Eclipse 中仅调试微服务架构中的一个网关(或微服务)?
- c# - 使用 IMemoryCache 扩展方法的单元测试方法
- android - 允许权限后相机预览不会膨胀,直到应用程序重新启动
- ssh - 如何证明SSH加密数据而Telnet不加密?
- python - 从 Pandas 中的一列列表创建不同的列
- python - Python 类多项式不起作用,就像我期望的那样
- python - Scraping Link Location
- python - Scrapy CrawlSpider:URL 深度