问题 '闪亮'R包如何处理数据帧?


我正在构建一个使用'twitteR'R软件包下载推文的网络应用程序,修改这些推文并通过“闪亮的”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() 返回,加载到 output$view)到 mainPanel()。我不知道为什么这不起作用。

任何帮助都会很棒!


7366
2017-11-27 00:10


起源

看起来像个bug。你应该报告: groups.google.com/group/shiny-discuss 无论出于何种原因,当您调用库(twitteR)时,不会复制as.data.frame的方法。甚至可能是命名空间问题。当我调整你的代码使用 twitteR::as.data.frame 它抽出了新的错误。 - Brandon Bertelsen
这不是一个闪亮的bug。你得到同样的错误 as.data.frame(userTimeline("nutwition_log")) - GSee
奇怪的是,因为那不是他正在运行的代码。但它正在把它当作自己的对待。他正在跑步 lapply(userTimeline("nutwition_log"),as.data.frame) - Brandon Bertelsen
@BrandonBertelsen好点!你的第一次预感似乎是正确的。这给出了错误: lapply(userTimeline("nutwition_log"), base::as.data.frame) - GSee
时间恰好!我今天早上正在调查这个漏洞,但找不到一个责备案。这应该有很多帮助。我相信我现在可以深入了解这一点。 - Joe Cheng


答案:


我想我已经得到了它: https://github.com/rstudio/shiny/commit/0b469f09df7e2ca3bbdb2ddadc8473a8126a9431

在对此进行适当测试并将其转换为新的Shiny构建之前,您可以使用devtools直接从GitHub进行测试:

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

谢谢,很高兴有一个固定!


10
2017-11-27 05:57



我确信这只是我的错误编码。我觉得有点兴奋,我可以帮忙。看到新的“下载数据”部分。非常感谢大家搞清楚这一点! - user1854990


我不确定这是不是一个错误,但这里肯定有一些奇怪的事情,Joe Cheng和他。我想知道。它的工作原理如下:

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


6
2017-11-27 01:17