Как я могу выбрать определенный столбец из фрейма данных в R, используя selectInput? - PullRequest
0 голосов
/ 03 июня 2019

Я хотел бы выбрать параметры из раскрывающегося списка, которые хранятся в виде различных атрибутов в моем фрейме данных, и использовать ползунок для изменения лет, чтобы я мог видеть его влияние на valueCard. Я застрял в том, чтобы выяснить, как можно вызвать атрибут pf_rol из фрейма данных df1, чтобы отразить его значение на 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://stackoverflow.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)
      )
    )
  )

)

server.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")
       )
     }

   }

})

})

output image below

1 Ответ

0 голосов
/ 03 июня 2019

Как и предлагалось в комментариях, взглянуть на то, как использовать реактив и наблюдать, необходимо, если вы хотите использовать блестящий.Официальный учебник действительно говорит обо всем этом: https://shiny.rstudio.com/tutorial/

Если кому-то интересно, я получил данные от Kaggle: https://www.kaggle.com/gsutters/the-human-freedom-index

В этом случае я бы определилcard как реактивное значение, по которому год фильтруется, а затем используется для визуализации выходных данных. Вот что я имею в виду:

Global:

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")

ui:

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)
  })

})
...