Как пакет "блестящий" R связан с кадрами данных?

Я создаю веб-приложение, которое загружает твиты, используя пакет "twitteR" R, обрабатывая эти твиты и отображая их через "блестящее" веб-приложение. У меня нет проблем с выполнением кода, который загружает и обрабатывает твиты в кадре данных:

do.call('rbind', lapply(userTimeline('nutwition_log'), as.data.frame))

... вы можете запустить это в своем терминале (с загруженной библиотекой twitteR) и увидеть, что он загружает данные твита и выводит результирующий кадр данных на экран.

Но когда я использую этот вид вызова в "блестящем" приложении (на стороне сервера)... например...


server.R:

library(shiny)
library(twitteR)
shinyServer(function(input, output) {

  datasetInput <- reactive(function() {
    tweets <- userTimeline(input$subscriber)
    do.call('rbind', lapply(tweets, as.data.frame))
  })

  output$view <- reactiveTable(function() {
    head(datasetInput(), n = input$obs)
  })

})

ui.R:

library(shiny)
library(twitteR)

shinyUI(pageWithSidebar(
  headerPanel('FitnessTrack'),
  sidebarPanel(
    selectInput("subscriber", "Select Subscriber:", 
                choices = c("nutwition_log", "anotherAccount")),
    numericInput("obs", "Number of observations to view:", 10)
  ),
  mainPanel(
    tableOutput("view")
  )
))

... Я получаю следующую ошибку:

Error in as.data.frame.default(X[[1L]], ...) : 
  cannot coerce class 'structure("status", package = "twitteR")' into a data.frame
Error in as.data.frame.default(X[[1L]], ...) : 
  cannot coerce class 'structure("status", package = "twitteR")' into a data.frame
Error in as.data.frame.default(X[[1L]], ...) : 
  cannot coerce class 'structure("status", package = "twitteR")' into a data.frame

... все, что я хочу сделать, - это изменить пользователя, чьи твиты загружаются и обрабатываются, а затем выводят результирующий фрейм данных (... datasetInput() return, загруженный в output$view) в mainPanel(). Я понятия не имею, почему это не работает.

Любая помощь будет замечательной!

Ответ 1

Я думаю, что у меня это получилось: https://github.com/rstudio/shiny/commit/0b469f09df7e2ca3bbdb2ddadc8473a8126a9431

Пока это не будет правильно протестировано и перевернуто в новую сборку Shiny, вы можете протестировать ее, используя devtools для установки прямо из GitHub:

library(devtools)
install_github('shiny', 'rstudio')

Спасибо, рад, что это исправлено!

Ответ 2

Я не уверен, что это ошибка, но здесь определенно странно, что Джо Чэн и соавтор. хотел бы знать. Он работает следующим образом:

server.R

library(shiny)
library(twitteR)
shinyServer(function(input, output) {

  datasetInput <- reactive(function() {
    tweets <- userTimeline(input$subscriber)
    tmp <- lapply(1:length(tweets),function(x) data.frame(
      text=tweets[[x]]$text,
      created=tweets[[x]]$created,
      screename=tweets[[x]]$getScreenName()))

    do.call(rbind,tmp)
  })

  output$view <- reactiveTable(function() {
    head(datasetInput(), n = input$obs)
  })

})

Так что это не проблема с data.frames, а скорее с тем, как twitteR устанавливает методы для объектов ссылочного класса status. Выполнение вашего одного и того же кода путем ссылки на поля с помощью аксессуаров, кажется, работает очень хорошо.

Похоже на "еще одну загадку класса S4/reference class".