11

我正在构建一个网络应用程序,该应用程序使用“twitteR”R 包下载推文,整理这些推文并通过“闪亮”R 网络应用程序显示它们。执行将推文下载并处理到数据框中的代码没有问题:

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

...您可以自己在终端中运行它(加载 twitteR 库),然后查看它下载推文数据并将生成的数据帧打印到屏幕上。

但是,当我在“闪亮”应用程序(服务器端)中使用这种调用时......例如......


服务器.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()返回,加载到output$view)输出到mainPanel(). 我不知道为什么这不起作用。

任何帮助都会很棒!

4

2 回答 2

10

我想我明白了:https ://github.com/rstudio/shiny/commit/0b469f09df7e2ca3bbdb2ddadc8473a8126a9431

在经过正确测试并将其引入新的 Shiny 构建之前,您可以使用 devtools 直接从 GitHub 安装来测试它:

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

谢谢,很高兴把那个修好了!

于 2012-11-27T05:57:04.637 回答
6

我不确定这是否是一个错误,但 Joe Cheng 和他的同事肯定会在这里发生一些奇怪的事情。想了解一下。它的工作原理是这样的:

服务器.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 / 参考类之谜”。

于 2012-11-27T01:17:09.400 回答