在常规函数R中使用反应变量

时间:2018-02-12 14:05:26

标签: r shiny shinydashboard

我正在尝试构建一个双语仪表板。在此仪表板中,我想根据输入$语言选择正确的语言列(ENG或NL)。此列用作绘制图形图形的函数的级别输入。

现在的问题是,当我使用单选按钮并更改语言时,情节图中没有任何变化。我猜测,当'custom_levels_lang'反应变量发生变化时,常规函数不会更新。

我该如何做到这一点?

server.R

library(shinydashboard)
library(dplyr)
library(tidyr)
library(shiny)
library(plotly)

#make bilangual df
ID = c("level_1_graph1","level_1_graph1")
NL = c("Ja","Nee")
ENG = c("Yes","No")

levels_lang = data.frame(ID,NL,ENG)


#create df for pie-chart
S <- c("Ja","Nee")
n <- c(645,544)
percentage <- c(54,46)


df <- data.frame(S,n,percentage)


function(input, output, session) {



# Creating levels by language


custom_levels_lang <- reactive({

#select chosen language for input$language, then transpose all levels per 
#graph number to separate columns
#gives custom_levels_lang$'name'
df <- levels_lang %>%
select(ID,one_of(input$language)) %>%
mutate(row = row_number()) %>%
spread_("ID",input$language)

#make list
df <- as.list(df)

#remove na's from list
df <- lapply(df, function(x) x[!is.na(x)])

return(df)



  })    





#create pie-chart    
plot_pie <- function(custom_levels){


plt <- renderPlotly({


#give right levels based on chosen language      
levels(df$S) <-  custom_levels



  #construct plot
  df %>%
    plot_ly(
      labels = df$S,
      values = ~percentage,
      type = 'pie',
      hole = 0.5,
      textinfo = 'percent',
      text = ~paste("n = ", n),
      hoverinfo = 'text') %>% 
    layout(
      showlegend = TRUE,
      legend = list(x = 0.2, y = -0.3),
      title = "title") %>% 
    config(
      displaylogo = FALSE,
      collaborate = FALSE,
      modeBarButtonsToRemove = list('zoom2d','pan2d','zoomIn2d','zoomOut2d',
      'autoScale2d','resetScale2d','toggleHover',
      'toggleSpikelines','hoverClosestCartesian','hoverCompareCartesian'))
})

return(plt)

}

output$plt1 <- plot_pie(custom_levels = custom_levels_lang()$level_1_graph1)

}

ui.R

library(shinydashboard)
library(dplyr)
library(tidyr)
library(shiny)
library(plotly)

header <- dashboardHeader(
title = "Welcome",
titleWidth = 450)

sidebar <- dashboardSidebar(width = 300, radioButtons("language", label = "Kies taal", choices = list("Nederlands" = "NL", "English" ="ENG"), selected = "NL"))

body <- dashboardBody( plotlyOutput('plt1') )

dashboardPage(header,sidebar,body)

1 个答案:

答案 0 :(得分:0)

renderPlotly函数必须在函数调用之外,以便在其依赖项(custom_levels_lang()$level_1_graph1)发生更改时得到通知。

在您的代码中,它不在反应式上下文中,因此只会呈现一次。

plot_pie <- function(custom_levels){
  #give right levels based on chosen language      
  levels(df$S) <-  custom_levels

  #construct plot
  plt <- df %>%
    plot_ly(
      labels = df$S,
      values = ~percentage,
      type = 'pie',
      hole = 0.5,
      textinfo = 'percent',
      text = ~paste("n = ", n),
      hoverinfo = 'text') %>% 
    layout(
      showlegend = TRUE,
      legend = list(x = 0.2, y = -0.3),
      title = "title") %>% 
    config(
      displaylogo = FALSE,
      collaborate = FALSE,
      modeBarButtonsToRemove = list('zoom2d','pan2d','zoomIn2d','zoomOut2d',
                                    'autoScale2d','resetScale2d','toggleHover',
                                    'toggleSpikelines','hoverClosestCartesian','hoverCompareCartesian'))
  return(plt)
}

output$plt1 <- renderPlotly(plot_pie(custom_levels = custom_levels_lang()$level_1_graph1))