【问题标题】:How does the 'shiny' R package deal with data frames?“闪亮”的 R 包如何处理数据帧?
【发布时间】:2012-11-14 13:11:48
【问题描述】:

我正在构建一个网络应用程序,它使用“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()。我不知道为什么这不起作用。

任何帮助都会很棒!

【问题讨论】:

  • 看起来像一个错误。您应该报告:groups.google.com/group/shiny-discuss,无论出于何种原因,当您调用 library(twitteR) 时,as.data.frame 的方法都不会被复制。甚至可能是命名空间问题。当我调整您的代码以使用 twitteR::as.data.frame 时,它会产生新的错误。
  • 这不是一个闪亮的错误。 as.data.frame(userTimeline("nutwition_log")) 会出现同样的错误
  • 奇怪,因为那不是他正在运行的代码。但它把它当作他是。他正在运行lapply(userTimeline("nutwition_log"),as.data.frame)
  • @BrandonBertelsen 好点!你的第一个预感看起来是正确的。这给出了错误:lapply(userTimeline("nutwition_log"), base::as.data.frame)
  • 完美时机!今天早上我正在调查这个错误,但找不到重现案例。这应该有很大帮助。我相信我现在可以查明真相了。

标签: r web-applications twitter dataframe shiny


【解决方案1】:

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

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

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

谢谢,很高兴能把它修好!

【讨论】:

  • 我确信这只是我编码错误的一个例子。我觉得有点激动,我可以帮忙。看到新的“下载数据”部分。非常感谢您解决这个问题!
【解决方案2】:

我不确定这是否是一个错误,但 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 / 参考类之谜”。

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2019-01-02
    • 2023-03-13
    • 2021-02-13
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多