R блестящее сообщение об ошибке приложения из аргумента формулы в `lm` - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь создать блестящее приложение, используя множественную линейную регрессию, которая позволяет выбирать более одной независимой переменной, но в настоящее время зависает на стороне сервера (я полагаю).Данные из здесь (таблица1_1).

Данные:

# A tibble: 1,289 x 6
    wage female nonwhite union education exper
   <dbl>  <dbl>    <dbl> <dbl>     <dbl> <dbl>
 1 11.55      1        0     0        12    20
 2  5.00      0        0     0         9     9
 3 12.00      0        0     0        16    15
 4  7.00      0        1     1        14    38
 5 21.15      1        1     0        16    19
 6  6.92      1        0     0        12     4
 7 10.00      1        0     0        12    14
 8  8.00      1        1     0        12    32
 9 15.63      0        0     0        18     7
10 18.22      1        0     0        18     5
# ... with 1,279 more rows

Коды:

library(shiny)
library(shinydashboard)

ui <- shinyUI(
  dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
      selectInput(inputId = "y", label = "Dependent Variable:", choices = names(table1_1[,c(2:7)])),
      selectInput(inputId = "x", label = "Independent Variable(s):",
                                 choices = names(table1_1[,c(2:7)]), multiple = TRUE),
                     sidebarMenu(
                       menuItem(text = "Summary", tabName = "summary_lm")
                     )
    ),
    dashboardBody(
      tabItems(
        tabItem(verbatimTextOutput("summary"), tabName = "summary_lm")
      )
    )
  )
)

server <- shinyServer(function(input,output){
  output$summary <- renderPrint({
    model <- reactive({
      lm(table1_1[,names(table1_1) %in% input$y] ~ table1_1[,names(table1_1) %in% input$x])
    })
    summary(model())
  })
})

shinyApp(ui,server)

Ошибка: недопустимый тип (список) для переменной 'table1_1 [, names (table1_1)% в% input $ y]'

Кто-нибудь поможет мне в том, где мой код работает неправильно?

1 Ответ

0 голосов
/ 13 октября 2018

Был ключ к тому, какая часть кода была ошибочной, и вы были правы, что это было в разделе на стороне сервера.Страница, которая отображается (как только вы исправили ошибку в коде, который ссылается на несуществующее седьмое имя), а после также исправила ошибочную конструкцию формулы для вызова lm, затем отобразилась без ошибки:

Call:
lm(formula = form, data = table1_1)

Residuals:
1 
1 

No Coefficients

Residual standard error: 1 on 1 degrees of freedom

Потому что в коде на стороне клиента не было ничего, что требовало бы выбора переменной на стороне x.Итак, вот как исправить первую существенную ошибку, связанную с построением формулы:

    server <- shinyServer(function(input,output){
  output$summary <- renderPrint({
    model <- reactive({ form <- as.formula( paste( names(table1_1)[names(table1_1) %in% input$y], "~", paste(names(table1_1)[names(table1_1) %in% input$x], collapse="+")))
      print(form)
      lm(form, data=table1_1)
    })
    summary(model())
  })
})

shinyApp(ui,server)

Объекты формулы должны быть построены либо синтаксически правильно, и их часто нужно очищать с помощью R, пропуская через as.formula, если нужны аргументыбыть рассчитанным.В действительности объекты формулы не должны искать значения из вызывающей среды.

(И после того, как я вставил это выражение в конструкцию формулы, я подумал, что было бы неплохо определить переменную, содержащую именаtibble объект.)

Теперь он работает, хотя при первом открытии страницы он не является информативным об этом факте.Если щелкнуть y-переменную, реактивный цикл успешно добавит ее в формулу и вычислит результат.

...