2014-12-18 2 views
2

Оригинальный вопрос размещен здесь:Shiny reactive Unexpected Behavior
Вопрос повторного размещена здесь, в попытке улучшить первоначальный вопрос отвечал ранее в ссылке, указанной выше, я не смог получать любую помощь.Блестящая реактивная функция не обновляется, как и ожидалось

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

В качестве функции функции server для определения индексов, соответствующих входам пользователя, определена реактивная функция с именем index. Реактивная функция, index, использует функции grep и which для определения соответствующих индексов в кадре данных df.

Я включил воспроизводимый код и попытался включить комментарии, где это необходимо.

Дальнейшее объяснение о коде:
Название этого вопроса только мое собственное предположение, и оно основано на предположении, что код внутри index является правильным. может возникнуть фундаментальная проблема с кодом в пределах index, а не с реактивностью функции index. Чтобы проверить это, как часть функции server, я включил функцию printIndex, чтобы распечатать результаты index, чтобы убедиться, что она работает правильно.

Я лично пробовал печатать результаты ind.j, ind.c, ind.l, ind.d, ind.s и ind.all каждого из них в отдельности в консоль и казалось, что они все производят правильные результаты. Однако, когда я тестирую результаты ind, это не совсем то, что я ожидаю, поэтому я задаюсь вопросом, является ли реактивность или линия кода проблематичной. То, что намеревается сделать ind, - это взять список всех искомых индексов, хранящихся в ind.all, и рекурсивно применить функцию intersect, чтобы найти общие элементы из всех подсписок в ind.all.

Как я уже упоминал выше, функция index работает отлично для отдельных фильтров. Однако, когда я вводим значения для всех индексов, как пользователь, функция не обновляется до нужного списка индексов, как ожидалось. Например, вы можете попробовать ввод «приложения» в Работа TextInput, «Gas Drive Global» в компании selectizeInput, и «Калгари» в Местоположение TextInput в то же время и ударил поиск!. Вы увидите, что таблица данных не возвращает никаких результатов, в то время как это явно соответствует 1-й строке кадра данных df.

#Load required packages 
ListofPackages= c('shiny','ggplot2','scales') 
lapply(ListofPackages,require,character.only=TRUE) 

#Define the dataframe on which the search will be performed 
df <- data.frame(Job=c('Applications Engineer ââ¬â Gas Drive', 
         'Engineer, Operations', 
         'Project Engineer', 
         'Project Engineer (Oil & Gas)', 
         'Project Engineer', 
         'Junior Engineer', 
         'Engineer, Operations', 
         'Research and Development (R&D) Junior Engineer', 
         'JUNIOR QUALITY ENGINEER', 
         'Junior Systems Design and Support Engineer', 
         'Mechanical Engineer Calgary, AB', 
         'Applications Engineer', 
         'Project Engineer', 
         'Pipeline Engineer', 
         'Development Engineer', 
         'Specialist Engineering Finance', 
         'Mechanical Engineer - Sudbury', 
         'Project Cost Analyst (12 month term)', 
         'Project Controls Functional Analyst', 
         'Project Controls Professionals'), 
      Company=c('Gas Drive Global', 
         'Agrium Wholesale', 
         'City of Calgary', 
         'Stantec', 
         'Shell', 
         'Canadian National Railway', 
         'Pembina Pipeline Corporation', 
         'Velan Inc.', 
         'G.W. Goudreau Personnel Services Ltd', 
         'Stratified Automotive Controls', 
         'Pason Systems Corp.', 
         'Howden', 
         'Plains Midstream Canada', 
         'Amec Foster Wheeler', 
         'Red Bend Software', 
         'Canadian Pacific', 
         'GENIVAR', 
         'Thales', 
         'AltaGas Ltd.','BEMAC Construction Corp.'), 
      Location=c('Calgary', 
         'Redwater', 
         'Calgary', 
         'Edmonton', 
         'Sarnia', 
         'Montréal', 
         'Calgary', 
         'Montréal', 
         'Windsor', 
         'Vancouver', 
         'Calgary', 
         'Winnipeg', 
         'Calgary', 
         'Calgary', 
         'Engineer', 
         'Calgary', 
         'Greater Sudbury', 
         'Ottawa', 
         'Calgary', 
         'Calgary'), 
       Posted=c(1, 
         1, 
         1, 
         2, 
         2, 
         1, 
         4, 
         5, 
         6, 
         4, 
         1, 
         5, 
         5, 
         3, 
         1, 
         1, 
         15, 
         1, 
         1, 
         13), 
      Source=c('Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed', 
         'Indeed'), 
       url=c('http://ca.indeed.com/rc/clk?jk=2371e16aab902f84', 
         'http://ca.indeed.com/rc/clk?jk=428facb738edd397', 
         'http://ca.indeed.com/rc/clk?jk=e15d8fe4d362279b', 
         'http://ca.indeed.com/rc/clk?jk=28c1464fd4e28b24', 
         'http://ca.indeed.com/rc/clk?jk=736ec57bf6902b93', 
         'http://ca.indeed.com/rc/clk?jk=bdc9999eae922645', 
         'http://ca.indeed.com/rc/clk?jk=3a4588fca0e600b1', 
         'http://ca.indeed.com/rc/clk?jk=71f1abcd100850c6', 
         'http://ca.indeed.com/cmp/G.W.Goudreau-Personnel-Services-Ltd/jobs/Junior-Quality-Engineer-3237601a1f3d3abc?r=1', 
         'http://ca.indeed.com/cmp/Stratified-Automotive-Controls/jobs/Junior-System-Design-Support-Engineer-1d916a435e69b8ce?r=1', 
         'http://ca.indeed.com/rc/clk?jk=fca9a784a37ece8a', 
         'http://ca.indeed.com/rc/clk?jk=b2d0975c638c03a8', 
         'http://ca.indeed.com/rc/clk?jk=c92725272c5f9ced', 
         'http://ca.indeed.com/rc/clk?jk=cd97c050df64787c', 
         'http://ca.indeed.com/rc/clk?jk=e6e278ed52532f73', 
         'http://ca.indeed.com/rc/clk?jk=a1f14d52c7798d7b', 
         'http://ca.indeed.com/rc/clk?jk=112350d5e020241f', 
         'http://ca.indeed.com/rc/clk?jk=a324c2dcade7dc5c', 
         'http://ca.indeed.com/rc/clk?jk=77895efdf28ad6fa', 
         'http://ca.indeed.com/cmp/BEMAC-Construction-Corp./jobs/Project-Control-Professional-90796e764f064a51?r=1')) 

server <- function(input,output,session){ 

    #Server-side search for the choices argument of selectizeInput in ui.R 
    updateSelectizeInput(session, 'c', choices = as.character(df$Company), server = TRUE) 

    #Create a reactive function to look up the indices correponding to the user's inputs 
    index <- reactive({ 
     ind.j <- if(input$j=='') NULL else grep(input$j,df[,'Job'],ignore.case = T) 
     ind.c <- {tmp<-lapply(input$c, function(x) {which(df[,'Company']==x)}); Reduce(union,tmp)} 
     ind.l <- if(input$l=='') NULL else grep(input$l,df[,'Location'],ignore.case = T) 
     ind.d <- which(df[,'Posted']<=input$d) 
     ind.s <- {tmp<-lapply(input$s, function(x) {which(df[,'Source']==x)}); Reduce(union,tmp)} 
     ind.all <- list(ind.j,ind.c,ind.l,ind.d,ind.s) 
     ind <- if(is.null(ind.s)) NULL else {ind.null<- which(lapply(ind.all,is.null)==TRUE) ;Reduce(intersect,ind.all[-ind.null])} 

    }) 

    #Create a reactive function to return the search results by returning the indices looked up in the index function above 
    search <- reactive({ 

       df[index(),] 

    }) 

    #Print the results of the index function above to test if it works properly 
    output$printIndex <- renderUI({ 
      list(index()) 
    }) 

    #Send the searchresult table to ui.R to print the results of the search function above 
    output$searchresult <- renderDataTable({ 
     input$action6 #triggered only when button is pressed 
     if(input$action6==0) return() 
     else{isolate({ 
      transformed <- transform(search(), Link = paste('<a href = ', shQuote(url), '>', 'Click</a>')) 
      transformed <- transformed[,c(1:3,5,7,4,6)] #Rearrange columns 
      transformed[-7] #Remove last column 
     }) 
     } 
    }, option=list(autoWidth=FALSE,pageLength=100, 
        columnDefs = list(list(targets =c(5,6) -1, searchable = FALSE),list(sWidth=c("100px"))))) 


} 

ui <- shinyUI(fluidPage(

    #Display datatable filters on top 
    tags$head(tags$style("tfoot {display: table-header-group;}")),   

    #Add a title 
    h1('Power Search'), 

    #Use the Sidebar layout 
    sidebarLayout(
     sidebarPanel(

      #Add various fields for the user in order to search the dataframe 
        h5('Note: Running the app takes a little while at startup.'), 
        helpText('Job:'), 
        textInput('j',''), 
        helpText('Company:'), 
        selectizeInput('c','',choices=NULL,multiple=T), 
        helpText('Location:'), 
        textInput('l',''), 
        sliderInput('d','Posted (days ago)',min = 0,max = 60,step = 5,value = 60), 
        checkboxGroupInput('s','',choices = c('Indeed','Glassdoor'),selected = c('Indeed','Glassdoor')), 
        actionButton('action6','Search!') 
     ), 


     mainPanel(

      #Display results 
      htmlOutput('printIndex'), 
      dataTableOutput('searchresult') 
     )  

    ) 
)) 

shinyApp(ui = ui, server = server) 

ответ

3

Проблема у вас есть с which функции:

> which(rep(FALSE, 5)) 
integer(0) 

Вы можете изменить:

ind <- if(is.null(ind.s)){ 
    NULL 
}else{ 
    ind.null<- which(lapply(ind.all,is.null)==TRUE) 
    Reduce(intersect,ind.all[-ind.null]) 
} 

к

ind <- if(is.null(ind.s)){ 
    NULL 
}else{ 
    Reduce(intersect,ind.all[!sapply(ind.all,is.null)]) 
} 

enter image description here

+0

Большое спасибо John !! Поэтому я предполагаю, что проблема была в том случае, когда 'ind.null' = 0 и поэтому' ind.all [-0] 'не будет работать. и обходной путь, как вы предположили, заключается в подмножестве 'ind.all' с логическим вектором, а не с числовым вектором. Это подтверждает мое понимание здесь? –

+0

'integer (0)' - пустой целочисленный вектор, а не '0L'. Отрицание пустого целочисленного вектора не влияет. Подмножество с использованием пустого целочисленного вектора возвращает пустой результат. – jdharrison

+0

В качестве ответа на этот вопрос и ссылку на ранее опубликованный вопрос [здесь] (http://stackoverflow.com/questions/27325855/shiny-error-arguments-imply-differing-number-of-rows), пожалуйста, попробуйте сняв флажок «Действительно» или попробовав любую другую комбинацию, которая приводит к фрейму с 0 строками, а затем нажмите «Поиск» и посмотрите, что произойдет. Мне сказали, что эта ошибка была решена в блестящей версии разработки, но я попробовал ее с версией разработки, и у меня все еще была та же ошибка. Можете ли вы пролить свет на то, что может вызвать проблему для случаев с 0 строками? –

Смежные вопросы