2017-06-18 299 views
1

我遇到了從Shiny中的響應中創建數據幀的問題。該應用程序允許用戶上傳一些數據,因此該數據集是被動的。然後它將允許用戶選擇將被傳遞到迴歸的輸入和輸出變量並且生成一個圖。 我不斷收到一個錯誤,指出:as.data.frame.default中的錯誤:無法將類「c(」reactiveExpr「,」reactive「)」強制轉換爲Shiny中的data.frame

Error in as.data.frame.default: cannot coerce class "c("reactiveExpr", "reactive")" to a data.frame 

我相信,它從被認爲是用戶上傳的數據的數據幀我d.f變量的到來。在淘寶上網之後,我一直無法找到解決方法。 任何幫助,將不勝感激。到目前爲止的代碼如下。

library(shiny) 
library(triangle) 
library(readxl) 
library(leaps) 
library(coefplot) 
library(relaimpo) 
library(data.table) 
library(XLConnect) 
library(xlsx) 

ui <- fluidPage(

    titlePanel("Hi"), 
    sidebarLayout(position = "left", 
       sidebarPanel(
        conditionalPanel(condition = "input.tabs1==1", 
            tags$style(type='text/css', ".well { max-width: 20em; }"), 
            # Tags: 
            tags$head(
            tags$style(type="text/css", "select[multiple] { width: 100%; height:10em}"), 
            tags$style(type="text/css", "select { width: 100%}"), 
            tags$style(type="text/css", "input { width: 19em; max-width:100%}") 
            ), 

            # Select filetype: 
            selectInput("readFunction", "Function to read data:", c(
            # Base R: 
            "read.table", 
            "read.csv", 
            "read.csv2", 
            "read.delim", 
            "read.delim2", 
            "readWorksheet", 
            "read_excel", 
            "read.xlsx" 

            )), 

            # Argument selecter: 
            htmlOutput("ArgSelect"), 

            # Argument field: 
            htmlOutput("ArgText"), 

            # Upload data: 
            fileInput("file", "Upload data-file:"), 

            # Variable selection: 
            htmlOutput("varselect"), 

            br(), 

            uiOutput("invar"), 
            br(), 
            uiOutput("outvar"), 

            textInput("name","Dataset name:","Data")), 
        conditionalPanel(condition = "input.tabs1==2", 
            #fileInput('file', 'Choose file to upload.'), 
            #selectizeInput('invar',"Select Invar", choices = varnames, multiple = TRUE), 
            #selectizeInput('outvar',"Select Outvar", choices = predictors, multiple = FALSE), 
            radioButtons('LM',"Select Regression",choices = list("LM" = 1, "LM2" = 2),selected = 1) 




       )), 
       mainPanel(
        tabsetPanel(id="tabs1", 
           tabPanel("Data File",value = 1,tableOutput("table")), 
           tabPanel("Plot",value=2,tableOutput("Data"),plotOutput("Plot"))  
       ) 
       ) 

)) 



server<-function(input, output) { 
    options(shiny.maxRequestSize=30*1024^2) 

    ### Argument names: 
    ArgNames <- reactive({ 
    Names <- names(formals(input$readFunction)[-1]) 
    Names <- Names[Names!="..."] 
    return(Names) 
    }) 

    # Argument selector: 
    output$ArgSelect <- renderUI({ 
    if (length(ArgNames())==0) return(NULL) 

    selectInput("arg","Argument:",ArgNames()) 
    }) 

    ## Arg text field: 
    output$ArgText <- renderUI({ 
    fun__arg <- paste0(input$readFunction,"__",input$arg) 

    if (is.null(input$arg)) return(NULL) 

    Defaults <- formals(input$readFunction) 

    if (is.null(input[[fun__arg]])) 
    { 
     textInput(fun__arg, label = "Enter value:", value = deparse(Defaults[[input$arg]])) 
    } else { 
     textInput(fun__arg, label = "Enter value:", value = input[[fun__arg]]) 
    } 
    }) 


    ### Data import: 
    Dataset <- reactive({ 
    if (is.null(input$file)) { 
     # User has not uploaded a file yet 
     return(data.frame()) 
    } 

    args <- grep(paste0("^",input$readFunction,"__"), names(input), value = TRUE) 

    argList <- list() 
    for (i in seq_along(args)) 
    { 
     argList[[i]] <- eval(parse(text=input[[args[i]]])) 
    } 
    names(argList) <- gsub(paste0("^",input$readFunction,"__"),"",args) 

    argList <- argList[names(argList) %in% ArgNames()] 

    Dataset <- as.data.frame(do.call(input$readFunction,c(list(input$file$datapath),argList))) 
    return(Dataset) 
    }) 

    # Select variables: 
    output$varselect <- renderUI({ 

    if (identical(Dataset(), '') || identical(Dataset(),data.frame())) return(NULL) 

    # Variable selection:  
    selectInput("vars", "Variables to use:", 
       names(Dataset()), names(Dataset()), multiple =TRUE)    
    }) 

    # Show table: 
    output$table <- renderTable({ 

    if (is.null(input$vars) || length(input$vars)==0) return(NULL) 

    return(Dataset()[,input$vars,drop=FALSE]) 
    }) 

    ################################################################################# 

    varnames<-reactive({ 
    names(input$readFunction) 
    }) 

    output$invar<-renderUI({ 
    selectizeInput('invar',"Select Invar", choices = names(Dataset()), multiple = TRUE) 
    }) 

    output$outvar<-renderUI({ 
    selectizeInput('outvar',"Select Outvar", choices = names(Dataset()), multiple = TRUE) 

    }) 

    d.f<-Dataset 

    output$Plot <- renderPlot({  

    SelectedVars <- input$invar 
    vartopredict <- input$outvar 

     fmla <- reformulate(SelectedVars, response = vartopredict) 
     pred.model=lm(fmla,d.f) 
     plot(pred.model) 
     abline(a=0,b=1,col="red") 


    }) 
} 

    shinyApp(ui = ui, server = server) 
+2

嘗試使用'd.f()'而不是'd.f'。 「被動」值不是「data.frame」。要訪問'reactive'值內的'data.frame',可以使用'()'。 – CPak

+0

@ChiPak兄弟我不知道如何謝謝你!我花了很多年試圖找出答案。非常感謝。 – John

回答

1

正如Chi Pak所提到的,被動表達式必須在末尾包含()。將d.f更改爲d.f()可以解決問題。

相關問題