hongooi73 / glmnetUtils

Utilities for glmnet
65 stars 18 forks source link

Calling glmnetUtils from within Shiny #8

Closed slackline closed 7 years ago

slackline commented 7 years ago

Hi,

Really grateful for your work on this, makes testing glmnet models a lot easier and moves towards standardising the formula based approach.

I'm trying to use glmnetUtils within a Shiny app I'm working on but have found that the data frame does not appear to be handled correctly when glmnetUtils::glmnet() is called. A simple example is...

server.R

shinyServer(function(input, output){
    output$lasso <- renderPrint((
        if(input$glmnet == TRUE){
            glmnetUtils::glmnet(data = mtcars,
                                formula = mpg ~ cyl + disp + hp,
                                family  = )
        }
        else{
            glm(data = mtcars,
                formula = mpg ~ cyl + disp + hp,
                family  = )
        }
    ))
})

ui.R

shinyUI(
    fluidPage(
        sidebarPanel(checkboxInput('glmnet', 'Use glmnet?',
                                   value = TRUE)),
        mainPanel(
            verbatimTextOutput('lasso'))
    )
)

If glm() is called the printed results of the fitted model are shown, but if glmnetUtils::glmnet() is called then the data frame isn't parsed correctly and the following error is reported...

Error : unused arguments (data = list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 
17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4, 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4, 
15.8, 19.7, 15, 21.4), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 
6, 8, 4), disp = c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8, 167.6, 167.6, 275.8, 275.8, 275.8, 
472, 460, 440, 78.7, 75.7, 71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351, 145, 301, 121), hp = 
c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 
150, 150, 245, 175, 66, 91, 113, 264, 175, 335, 109), drat = c(3.9, 3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 
3.69, 3.92, 3.92, 3.92, 3.07, 3.07, 3.07, 2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 3.15, 3.73, 3.08, 
4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 
3.44, 3.44, 4.07, 3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 1.615, 1.835, 2.465, 3.52, 3.435, 3.84, 3.845, 
1.935, 2.14, 1.513, 3.17, 2.77, 3.57, 2.78), qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 
20, 22.9, 18.3, 18.9, 17.4, 17.6, 18, 17.98, 17.82, 17.42, 19.47, 18.52, 19.9, 20.01, 16.87, 17.3, 15.41, 
17.05, 18.9, 16.7, 16.9, 14.5, 15.5, 14.6, 18.6), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 
1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 
0, 1, 1, 1, 1, 1, 1, 1), gear = c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 5, 
5, 5, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4, 6, 8, 2)), 
formula = mpg ~ cyl + disp + hp)

I realise this might be a Shiny issue but since glm() parses/uses the data frame correctly I think, but am not sure, that the problem may lie within glmnetUtils::glmnet() somewhere.

hongooi73 commented 7 years ago

This is due to peculiarities in how S3 class methods are found. If you switch the order of your arguments so that they match the declared signature, and remove the empty family argument, things should work:

...
        if(input$glmnet == TRUE){
            glmnetUtils::glmnet(formula = mpg ~ cyl + disp + hp,
                                data = mtcars)
        }
..
slackline commented 7 years ago

Thats sorted it thank you very much. I've never encountered that peculiarity with the S3 class methods. Will try and remember it in the future though.