object $ a:'closure'类型的对象不是子集

时间:2018-03-15 14:17:36

标签: r

当我在代码下面运行时出现此错误,任何人都可以告诉我如何克服此错误。     下面是mydata是主要数据集的代码,我使用下面的代码创建了一个闪亮的仪表板。 我尝试将其中一个列作为URL,但它在标题中显示错误。

我尝试提供数据()$ IFX_USERNAME,因为在他的闪亮应用程序中是一个非常常见的错误。当您使用reactive()函数创建一个对象(如list,data.frame或vector)时,通常会出现这种情况 - 也就是说,您的对象会对某种输入做出反应。如果这样做,当您之后引用对象时,必须包括括号。

例如,假设您创建了一个反应性数据框架,如下所示:

MyDF< -reactive({使用名为“X”的列生成data.frame的代码}) 如果您希望引用data.frame并将其称为MyDF或MyDF $ X,则会出现错误。相反,它应该是MyDF()或MyDF()$ X您需要使用此命名约定与您使用reactive()创建的任何对象,即使它显示相同的错误

library("shiny")
    library("datasets")
    library("DT")
    library("shinyBS")
    library(tidyr)

    lapply( dbListConnections( dbDriver( drv = "MySQL")), dbDisconnect) 
    #connecting to database
    dbListTables(mydb)
    dbListFields(mydb, 'DL_COMMUNITY')
    rs = dbSendQuery(mydb, "select * from DL_COMMUNITY")
    mydatabase=fetch(rs)
    setDT(mydatabase)
    colnames(mydatabase)


    header <- dashboardHeader()

    ui = shinyUI(fluidPage(
      DT::dataTableOutput("mtcarsTable"),
      bsModal("mtCarsModal", "My Modal", "",dataTableOutput('mytext'), size = "large")
    ))

    on_click_js = "
    Shiny.onInputChange('mydata', '%s');
    $('#mtCarsModal').modal('show')
    "

    on_click_js1 = "
    Shiny.onInputChange('mydata', '%s');
    $('#mtcarsTable').modal('show')
    "

    convert_to_link = function(x) {
      as.character(tags$a(href = "#", onclick = sprintf(on_click_js,x), x))
    }
    convert_to_link1 = function(x) {
      as.character(tags$a(href = "#", onclick = sprintf(on_click_js1,x), x))
    }

    shinyApp(
      ui = ui,
      server = function(input, output, session) {

        mtcarsLinked <- reactive({   
          mydatabase$IFX_USERNAME <- sapply(
            mydatabase$IFX_USERNAME,convert_to_link)
          return(mydatabase)
        })

        **linked <- reactive({
          myd$TEAM_MEMBERS <- sapply(
            myd$TEAM_MEMBERS,convert_to_link1)
          return(myd)

        })**

        output$mtcarsTable <- DT::renderDataTable({
          DT::datatable(mtcarsLinked(), 
                        class = 'compact',
                        escape = FALSE, selection='none'
          )
        })
        output$mytext = DT::renderDataTable({
          #userQuery=paste("select PROJECT,COMMENT from DL_COMMUNITY where IFX_USERNAME = '",user,"'",sep="")
          #rs = dbSendQuery(mysqlCon,userQuery)
          userQuery=paste("SELECT * 
            from Heatmap.DL_PROJECT where CONCAT(',', TEAM_MEMBERS, ',')  like '%,sa,%' 
          or PROJECT_OWNER like '%,sa,%'
          or PROJECT_LEAD like '%,sa,%'")
          rs = dbSendQuery(mydb,userQuery)
          myd=fetch(rs,n=-1)
          myd<-data.frame(myd)
          myd$TEAM_MEMBERS<- as.list(strsplit(myd$TEAM_MEMBERS, ","))
          #myd<-myd %>% 
               #mutate(TEAM_MEMBERS = strsplit(as.character(TEAM_MEMBERS), ",")) %>% 
               #unnest(TEAM_MEMBERS)
          #setDT(myd)
         #hello <- input$mydata
         #myd<-mydatabase[mydatabase$IFX_USERNAME==input$mydata,]
         #myd1<-t(myd)
         DT::datatable(linked(),
                   class='compact',
                   escape = FALSE,selection = 'none')  
      })
    }
    )

1 个答案:

答案 0 :(得分:0)

首先,在调用反应函数时始终使用my_reactive(),例如my_reactive

其次,object of type closure not subsettable通常意味着无法找到您想要子集的对象(此处带有$)。您没有object not found错误,因为您已经为其命名了

与jogo的示例一样,尝试子集mean时也会出现相同的错误。 mean是R中的一个对象,因此它存在,R不会返回object not found,但它是一个函数,你不能从中进行子集,因此错误object is not subsettable

比较以下代码行的结果。

mean[1]
mean <- c(1, 3)
mean[1]

另请注意,R仍然可以使用mean来执行数字向量的均值,因为它知道何时查找函数或其他内容。但强烈建议不要这样做。您应始终使用有意义的名称正确命名对象。