闪电反应功能未按预期更新 [英] Shiny reactive function is not updating as expected

查看:135
本文介绍了闪电反应功能未按预期更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

发布在此的原始问题闪亮反应意外行为 < br>
这个问题正在这里重新发布,试图改进以前在上面提供的链接中发布的原始问题,因为我无法获得任何帮助。

Original question posted here: Shiny reactive Unexpected Behavior
The question is being re-posted here in an attempt to improve the original question posted previously in the link provided above as I was not able to receive any assistance.

目标:简而言之,此应用程序的目的是允许用户执行搜索,过滤和切片并切割数据,基于提供给用户的各种输入从数据帧提供。

Objective: In brief, the purpose of this app is to allow the user to perform search, filter, and slice and dice the data, provided in from of a dataframe, based on various inputs provided to the user.

作为服务器函数的一部分,一个名为 index 被定义为查找与用户输入相对应的索引。反应函数 index 使用 grep 其中函数以定位数据框 df 中的各个索引。

As part of the server function, a reactive function named index has been defined to look up the indices corresponding to the user's inputs. The reactive function,index, uses grep and which functions to locate the respective indices in the dataframe df.

我已经包含了一个可重现的代码,并尝试在适当的时候加入评论。

I have included a reproducible code and tried to include comments, where appropriate.

有关代码的进一步解释:

这个问题的标题只是我自己的猜测,它基于假设 index 中的代码是正确的。在 index 中的代码可能存在一个基本问题,而不是索引函数的反应性。为了测试这个,作为服务器函数的一部分,我已经包含一个函数 printIndex ,以打印 index 的结果,以确保其正常工作。

Further explanation about the code:
The title of this question is just my own speculation and it's based on the assumption that the code within index is correct. there might be a fundamental issue with the code within index and not the reactivity of the index function necessarily. In order to test this, as part of the server function, I have included a function printIndex in order to print the results of index to make sure that it works properly.

我个人尝试打印 ind.j ind.c ind.l ind.d ind.s ind.all 每个个人到控制台,他们似乎都产生正确的结果。但是,当我测试 ind 的结果时,这不是我期望的结果,所以我想知道它是反应性还是代码行是有问题的。 ind 打算做的是将所有查询索引的列表存储在 ind.all ,并递归地应用 intersect 函数,以查找 ind.all 中所有子列表中的公共元素。

I have personally tried printing the results of ind.j, ind.c, ind.l,ind.d, ind.s, and ind.all each one individually to the console and they seemed to all produce the right results. However, when I test the results of ind it's not quite what I expect so I'm wondering if it's the reactivity or the line of code that's problematic. What the ind intends to do is to take the list of all the looked-up indices, stored in ind.all, and applies the intersect function recursively to find the common elements from all the sublists in ind.all.

如上所述,索引功能适用于单个过滤器。但是,当我输入所有索引的值时,作为用户,该函数不按预期更新到正确的索引列表。例如,您可以尝试在公司 selectizeInput中的作业 textInput,Gas Drive Global中输入应用程序,在位置中输入Calgary / strong> textInput同时点击搜索!。您将看到数据表不返回任何结果,而这显然对应于数据框的第一行 df

As I mentioned above, the index function works fine for individual filters. However, when I enter values for all the indices, as a user, the function does not update to the correct list of indices as expected. For example, you can try inputting "application" in the Job textInput, "Gas Drive Global" in the Company selectizeInput, and "Calgary" in the Location textInput at the same time and hit Search!. You will see that the data table does not return any results while this clearly corresponds to the 1st row of the dataframe 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)


推荐答案

您所遇到的问题是哪个 function:

The problem you have is with the which function:

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

这篇关于闪电反应功能未按预期更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆