如何使用 selectInput 从 R 中的数据框中选择特定列?

Posted

技术标签:

【中文标题】如何使用 selectInput 从 R 中的数据框中选择特定列?【英文标题】:How can I select a specific column from a data frame in R using selectInput? 【发布时间】:2019-10-18 16:30:20 【问题描述】:

我想从下拉列表中选择选项,这些选项作为不同的属性存储在我的数据框中,并使用滑块更改年份,以便我可以看到它对 valueCard 的影响。我被卡住的地方是,要找出如何从 df1 数据帧调用 pf_rol 属性以反映其在 valueCard 上的值。

我已经成功创建了 2 个值卡,它们可以通过一个滑块来操作,但现在我想使用滑块和 selectInput 来更改 ValueCard 'pfrol' 中的值。

PS:如果有人帮助绘制地图,我将不胜感激。我有所有国家/地区的名称,并希望通过滑块来操纵不同的属性,以观察变化的趋势,就像价值卡一样。

global.r

df <-   read.csv("hfi_cc_2018.csv", header = T)

summary(df)
sapply(df, function(x) sum(is.na(x)))
#Replace Null Values
df[is.na(df)] <- 0
df[,5:ncol(df)] <- round(df[,5:ncol(df)], 2)

#adding selective columns new df1
#https://***.com/questions/10085806/extracting-specific-columns-from-a-data-frame
df1<-  df[, (names(df) %in% c("year","countries","region","pf_rol", "pf_ss_homicide","pf_ss_disappearances_violent",    
))]

ui.r

require(shiny)
require(shinydashboard)

shinyUI(

  dashboardPage( 
    dashboardHeader(title = "Human Freedom Index", titleWidth = 300),
    dashboardSidebar(
      sliderInput("years","Select Year:",
                  min = min(df1$year),
                  max = max(df1$year),
                  value = min(df1$year),
                  step = 1),
      selectInput("variable","Select Freedom Factor:",
                  choices = list("Rule of Law"= "pf_rol",
                                 "Homicides Reported" = "pf_ss_homicide")
                  )
    ),

    dashboardBody(
        fluidRow(
        valueBoxOutput("pfrol"),  
        valueBoxOutput("pfrank"),
        valueBoxOutput("efrank")
      ),
      fluidRow(
        box(plotlyOutput("plot1"), width=15, height=400)
      )
    )
  )

)

服务器.r

require(shiny)
require(dplyr)
require(shinydashboard)

shinyServer(function(input,output)

   observe(
     (card <- df1 %>%
      filter(year == input$years))
    output$pfrank = renderValueBox(
      valueBox(round(mean(card$pf_score),1),
               "Personal Freedom Score")
    )

  )  

observe(

   if(input$variable == "Rule of Law")
     if(filter(df1$year == input$years))
       output$pfrol = renderValueBox(
         valueBox(round(mean(df1$pf_rol),1),
                  "Rule of Law")
       )
     

   

)

)

【问题讨论】:

了解观察和反应之间的区别。您的代码几乎包含了您在 Shiny 中可以做的所有不良做法 您能否解释一下我可以修改代码的哪些区域。我是 R 的新手,而且很闪亮。 ***.com/questions/53016404/… 这是一本好书 :-) 我建议将代码分解为您遇到的问题。看到所有这些代码并不能激励其他人回答这个问题。也许你可以缩短问题。例如:以下问题与您的问题plot_ly(card, x = card$pf_score, y = card$ef_score, text = card$countries, type = 'scatter', color = card$region, colors = 'Paired', mode = 'markers',marker = list( size = 20, opacity = 0.4 )) %&gt;% layout(title = 'Personal _Freedom vs Economical Freedom', xaxis = list(showgrid = FALSE), yaxis = list(showgrid = FALSE)) 是否真的相关? 感谢您的提醒,现已编辑。请告诉我如何解决我的问题? 【参考方案1】:

就像 cmets 中所建议的那样,如果您想使用闪亮,则必须了解如何使用响应式和观察式。官方教程真的讲了这一切:https://shiny.rstudio.com/tutorial/

如果有人感兴趣,我从 Kaggle 获得数据:https://www.kaggle.com/gsutters/the-human-freedom-index

在这种情况下我要做的是将card定义为过滤年份的反应值,然后用它来渲染输出,这就是我的意思:

全球:

df <-   read.csv("hfi_cc_2018.csv", header = T)

# Replace Null Values
df[is.na(df)] <- 0
df[,5:ncol(df)] <- round(df[,5:ncol(df)], 2)

df1<-  df[, (names(df) %in% 
               c("year", "pf_rol", "pf_ss_homicide", "pf_score"))]

#  added this to global to get the label for the card
select_ops <- c("Rule of Law"= "pf_rol",
                "Homicides Reported" = "pf_ss_homicide")

用户界面:

library(shiny)
library(shinydashboard)

shinyUI(dashboardPage( 
  dashboardHeader(title = "Human Freedom Index", titleWidth = 300),
  dashboardSidebar(
    sliderInput("years","Select Year:",
                min = min(df1$year),
                max = max(df1$year),
                value = min(df1$year),
                step = 1),
    selectInput("variable","Select Freedom Factor:",
                choices = c("Rule of Law"= "pf_rol",
                            "Homicides Reported" = "pf_ss_homicide")
    )
  ),

  dashboardBody(
    fluidRow(
      valueBoxOutput("pfrol"),  
      valueBoxOutput("pfrank")
    ),
    fluidRow(
      box(width=15, height=400)
    )
  )
))

服务器:

library(shiny)
library(dplyr) 

shinyServer(function(input,output)
  card <- reactive(df1 %>%
                     filter(year == input$years))

  output$pfrank <- renderValueBox(
    valueBox(round(mean(card()$pf_score), 1),
             "Personal Freedom Score")
  )

  output$pfrol <- renderValueBox(
    lbl <- names(select_ops)[select_ops==input$variable]
    valueBox(round(mean(card() %>%  pull(input$variable)), 1),
             lbl)
  )

)

【讨论】:

以上是关于如何使用 selectInput 从 R 中的数据框中选择特定列?的主要内容,如果未能解决你的问题,请参考以下文章

根据R中的selectinput值更改图表

从 SelectInput (R Shiny) 中的分组选项列表中获取组标签

如何使用 actionButton 更改 R Shiny 中 selectInput 上的选定值?

使用两个相关的 selectInput 过滤 R Shiny 中的数据帧

从 selectInput 到 facet_wrap 的多个变量:R Shiny

如何在 R Markdown 中创建条件 selectInput 小部件?