2017-08-15 57 views
0

我有一个闪亮的应用程序,我希望用户能够上传自己的数据并运行gbm模型。上传的数据库将是所有预测变量和响应变量的数据框。这将要求用户输入响应变量作为被动输入,或从列名称列表中选择它。这里是我到目前为止已经试过:有光泽的应用程序gbm模型公式的反应响应变量

library(shiny) 
library(gbm) 


ui <- fluidPage(
    fluidRow(
    column(3,textInput("response","Enter the response variable",value="Petal.Width")), 
    column(9,verbatimTextOutput("summary")) 
) 
) 
server <- function(input, output, session) { 


    output$summary <- renderPrint({ 
model<-gbm(input$response~., data=iris, 
       distribution="gaussian", 
       bag.fraction=.5, 
       n.trees=1000, 
       interaction.depth=4, 
       shrinkage=0.01, 
       n.minobsinnode=10, 
       verbose=FALSE) 
    summary(model) 

    }) 



} 


shinyApp(ui=ui,server=server) 

但我得到一个可变长度不同的错误:

Warning: Error in model.frame.default: variable lengths differ (found for 'Sepal.Length') 
Stack trace (innermost first): 
    90: model.frame.default 
    89: model.frame 
    88: eval 
    87: eval 
    86: gbm 
    85: renderPrint [D:/Dropbox/PhD/Nitrate Mapping Project/USGS Project/SOPs and Test Data/1SE SOP/gbm_reac_response.R#15] 
    84: func 
    83: eval 
    82: eval 
    81: withVisible 
    80: evalVis 
    79: utils::capture.output 
    78: paste 
    77: origRenderFunc 
    76: output$summary 
    1: runApp 

回答

1

你可以使用一个reactive()对象到您的用户输入转换成formula对象传递给gbm()。像这样的东西会工作....

library(shiny) 
library(gbm) 


ui <- fluidPage(
    fluidRow(
     column(3,textInput("response","Enter the response variable", 
          value="Petal.Width")), 
     column(9,verbatimTextOutput("summary")) 
    ) 
) 
server <- function(input, output, session) { 

    f <- reactive({ as.formula(paste(input$response, "~ .")) }) 

    output$summary <- renderPrint({ 
     model<-gbm(f(), data=iris, 
        distribution="gaussian", 
        bag.fraction=.5, 
        n.trees=1000, 
        interaction.depth=4, 
        shrinkage=0.01, 
        n.minobsinnode=10, 
        verbose=FALSE) 
     summary(model) 

    }) 

} 


shinyApp(ui=ui,server=server)