2012-11-27 12 views
11

Sto costruendo un'app Web che scarica i tweet utilizzando il pacchetto 'twitteR' R, mungendo quei tweet e visualizzandoli tramite un'app Web R brillante. Non ho alcun problema l'esecuzione del codice che scarica ed elabora i tweets in una cornice di dati:In che modo il pacchetto R "lucido" si occupa dei frame di dati?

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

... è possibile eseguire questo nel vostro terminale (con la libreria Twitter caricato) te stesso e vedere che venga scaricato il tweet dati e stampa la cornice dati risultante sullo schermo.

Ma, quando uso questo tipo di chiamata in un app 'lucido' (lato server) ... per esempio ...


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") 
) 
)) 

... ottengo il seguente errore:

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 

... tutto quello che voglio fare è essere in grado di cambiare l'utente di cui tweets vengono scaricati e munged, producendo quindi la struttura risultante dati (... il ritorno datasetInput(), caricata a output$view) alla mainPanel(). Non ho idea del perché questo non funziona.

Qualsiasi aiuto sarebbe fantastico!

+1

Sembra un bug. Dovresti segnalare a: http://groups.google.com/group/shiny-discuss per qualsiasi motivo i metodi per as.data.frame non vengono copiati quando si chiama library (twitteR). Forse anche un problema di namespace. Quando aggiusto il tuo codice per usare 'twitteR :: as.data.frame', emette nuovi errori. –

+1

Questo non è un bug brillante. Si ottiene lo stesso errore con 'as.data.frame (userTimeline (" nutwition_log "))' – GSee

+1

Strano però, perché non è il codice che sta girando. Ma lo tratta come se lo fosse. Sta eseguendo 'lapply (userTimeline (" nutwition_log "), as.data.frame)' –

risposta

6

Non sono sicuro se questo è un bug, ma c'è sicuramente qualche stranezza in corso qui che Joe Cheng e co. vorrei sapere. Funziona, in questo modo:

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) 
    }) 

}) 

quindi non è un problema con data.frames, ma piuttosto qualcosa a che fare con il modo in cui Twitter stabilisce i metodi per gli oggetti della classe di riferimento status. L'esecuzione dello stesso esatto codice facendo riferimento ai campi tramite gli accessor sembra funzionare correttamente.

Si sente come "un ennesimo S4/mistero della classe di riferimento".

10

Credo di aver capito: https://github.com/rstudio/shiny/commit/0b469f09df7e2ca3bbdb2ddadc8473a8126a9431

Fino a quando questo è correttamente testato e rotolato in una nuova build Brillante, è possibile testarlo utilizzando devtools installare direttamente da GitHub:

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

Grazie, felice di averlo risolto!

+0

Ero sicuro che fosse solo un mio caso che stavo codificando qualcosa in modo errato. Mi sento un po 'entusiasta di poter aiutare. Ho visto la nuova sezione "Download dei dati". Grazie mille per aver capito questo! – user1854990

Problemi correlati