2017-11-02 4 views
0

Ich versuche eine App mit glänzenden Modulen und data.table zu entwickeln, aber ich kann nicht herausfinden, wie es funktioniert. Ein kleines Beispiel ist die folgende App, die als Argumente des Moduls eine data.table, eine Variable und einen Cut-Wert erhält und alle Ergebnisse basierend auf dem Filtern der data.table mit den Argumenten ausgeben soll.Shiny Module und data.table Filter: funktioniert nicht wie erwartet

library(shiny) 
library(data.table) 

name <-c('a','b','c','d','e') 
value <- c(2,4,6,8,10) 
data <- data.table(name,value) 

# MODULE UI 
test_UI <- function(id) { 
    ns <- NS(id) 
    textOutput(ns("test")) 
} 

# MODULE Server 
test_OUT <- function(input, output, session, df, var, x) { 
    output$test <- renderText({  
    d <- df[var > x, ] 
    print(unique(d$name)) 
    }) 
} 

# App ui 
ui <- fluidPage(
    test_UI("test") 
) 

# App server 
server <- function(input, output,session){ 
    callModule(test_OUT, "test", data, 'value', 6) 
} 

# App 
shinyApp(ui, server) 

Das Ergebnis ist:

> a b c d e 

Wenn es sein soll:

> d e 

Ich weiß, wenn ich dplyr oder andere Verfahren zum Filtern verwenden, sollte dies funktionieren, aber ich brauche data.table for performance, da es sich um sehr große Datensätze handelt. Vielen Dank im Voraus!

Antwort

0

Ich mache es mit "Get" arbeiten.

I ersetzt die Zeile:

d <- df[var > x, ] 

mit

d <- df[get(var) > x, ] 

und es funktionierte!

0

Der Grund, warum dies nicht funktioniert, ist, weil data.table sich selbst als Umgebung verwendet. So

df[var > x, ] 

sucht nach einer Spalte mit dem Namen var (Anmerkung: nicht den Wert von var, aber df[["var"]]) und sieht nicht, es sieht dann in der Elternumgebung (die test_OUT-Funktion) und jetzt ist es zu finden. Und es ist der Charaktervektor "value".

So, seit x == 6, ist der Vergleich "value" > 6, die TRUE ist. Deshalb bekommst du jede Zeile.

Um mehr Informationen darüber zu erhalten, wie data.table funktioniert, sollten Sie die Dokumentation lesen: ?data.table. Es ist eigentlich ziemlich gut.

Für Ihr Problem, ersetzen

d <- df[var > x, ] 

mit

d <- df[df[[var]] > x, ] 

df[[var]] verwendet den list-style subsetting mit Namen.

+0

danke Nathan! Ich werde data.table Dokumente überprüfen. Ich habe es "auf sehr chaotische Weise" gelernt. Sehen Sie Probleme mit der "Get" -Lösung? Danke noch einmal. – COLO

+0

'get' kann zu unerwartetem Verhalten führen, da es auch außerhalb der data.table aussehen kann. Zum Beispiel, wenn die Variable 'foo' in' test_OUT' zugewiesen ist und jemand das Modul mit 'var =" foo "' aufruft, dann liefert 'get (var) '' 'foo', aber' df [[var]] 'gibt' NULL' zurück. –

+0

danke. Das macht Sinn. – COLO

Verwandte Themen