Обработка предупреждений с блоками if / else в Shiny - PullRequest
0 голосов
/ 07 марта 2019

Я разрабатываю блестящее приложение.который выбирает номинальные (факторы) и порядковые (числовые) переменные для данного набора данных.Затем он преобразует номинальную переменную (и) (мужской, женский) в фиктивную переменную (и).И в конечном итоге объединяет порядковые переменные с фиктивными переменными.Приложение работает нормально, если я выбираю как номинальные, так и порядковые переменные.Но если я хочу выбрать только номинальные ИЛИ порядковые переменные, я получаю предупреждения: «Столбцы символов или факторов не найдены. Пожалуйста, используйте select_columns для выбора столбцов».Вот мои server.r и ui.R

library(fastDummies)
library(data.table)
data=data.frame(A=c(5,2,4),B=c('male','male','female'),C=c(1,3,5))
shinyServer(
function(input, output){
#Select Explanatory Nominal Variables 
output$ColumnSelector_dummy <- renderUI({
  selectInput("SelectedDummy","Select Nominal Variables (values: male,female)", 
              choices = as.list(names(data)),multiple=TRUE, selected = NULL)
})
#
df_subset_dummy <- reactive({
  a <- subset(data, select = input$SelectedDummy)
  return(a) 
})
#Convert Nominal variables to Dummy variables 
df_subset_dummy_tranformed <- reactive({
  df1 <- lapply( df_subset_dummy(), factor)
  df2 <- fastDummies::dummy_cols(df1)
  drops <- names(df1)
  df3 <- df2[, !(names(df2) %in% drops)]
  return(df3)
})
#Select Explanatory Ordinal Variables
output$ColumnSelector_ordinal<- renderUI({
  selectInput("SelectedOrdinal","Select Ordinal Variables (values: 1,2,3,4,5,6)", 
              choices = as.list(names(data)), multiple=TRUE,selected = NULL )
}) 
 df_subset_ordinal <- reactive({
  a <- subset(data, select = input$SelectedOrdinal)
  return(a) 
})  
 #Join Ordinal and Nominal dataframes   
df_nominal_ordinal_bind <- reactive({  
  df <- cbind(df_subset_dummy_tranformed(),df_subset_ordinal()) 
  return(df)
})
output$table_ordinal_nominal <- renderTable(head(df_nominal_ordinal_bind()))  
})

shinyUI(
 fluidPage(
   tabsetPanel(
     tabPanel("Data", fluid = TRUE,
            sidebarLayout(
               sidebarPanel(
               uiOutput("ColumnSelector_dummy"),  
               uiOutput("ColumnSelector_ordinal")
             ),
             mainPanel(
               tabsetPanel(
                 tabPanel('Subsets',
                          tableOutput('table_ordinal_nominal')
               ) )) ) ))))

вопрос: Как я могу использовать tryCatch и блокировать if / else, чтобы, если df_subset_dummy_tranformed () ИЛИ df_subset_ordinal () не существовал, я все равно получил результатдля df_nominal_ordinal_bind, и это также может быть показано в виде таблицы в выходных данных $ table_ordinal_nominal.Любая помощь будет оценена.

1 Ответ

1 голос
/ 07 марта 2019

Не слишком меняя свой код / ​​подход, я думаю, вы могли бы начать с добавления проверки на df_subset_dummy():

df_subset_dummy_tranformed <- reactive({
  res <- df_subset_dummy()
  if (length(res) == 0) return(res)
  df1 <- lapply(res, factor)
  df2 <- fastDummies::dummy_cols(df1)
  drops <- names(df1)
  df3 <- df2[, !(names(df2) %in% drops)]
  return(df3)
})

По крайней мере, это должно учитывать упомянутое вами предупреждение.

...