2016-03-18 10 views
0

Der folgende Code funktioniert, wenn ich einen int in für col_num passieren:R Shiny wählen Spalte von checkboxGroupInput

makeHRdata = function(Test, model, col_num) { 
    means = 1:length(Test) 
    for (i in 1:length(Test)) means[i] = mean(Test[,i]) 
    TestCopy = Test[1,] 
    TestCopy[1,] = t(means) 
    pdpHR = range(Test[col_num]) 
    for (i in range(Test[col_num])[1]:range(Test[col_num])[2]) { 
    TestCopy[1,col_num] = i 
    pdpHR[i] = predict(model,TestCopy) 
    } 
    return(pdpHR) 
} 

Ich möchte Benutzer in der Lage sein, die col_num in einem checkboxGroupInput auszuwählen (diese Funktion ermöglichen aufgerufen werden mehrmals).

ich ausdrucken kann die Eingabe des Benutzers mit checkboxGroupInput wie folgt aus:

output$text5 <- renderText({ 
     paste("The object you selected is ", 
      input$select_columns2) 
}) 

So Eingang $ select_columns2 enthält eine Reihe von Namen einer Spalte.

Ich habe versucht, diese Funktion Umschreiben der Zeichenfolge anstelle des int für Spaltennamen zu übernehmen:

makeHRdata = function(Test, model, col_num) { 
    means = 1:length(Test) 
    for (i in 1:length(Test)) means[i] = mean(Test[,i]) 
    TestCopy = Test[1,] 
    TestCopy[1,] = t(means) 
    pdpHR = range(Test$col_num) 
    for (i in range(Test$col_num)[1]:range(Test$col_num)[2]) { 
    #TestCopy[1,col_num] = i 
    TestCopy$col_num[1] = i 
    pdpHR[i] = predict(model,TestCopy) 
    } 
    return(pdpHR) 
} 

ich diese Funktion mit diesem Aufruf:

reactiveHRdata = reactive({ 
     makeHRdata(get(input$select_test_data2),eecs,input$select_columns2) 
}) 

Die Störung, die ich erhalte, wenn ich versuchen, das ist: Fehler im Bereich (Test $ col_num) [1]: Bereich (Test $ col_num) [2]: Ergebnis wäre zu lang ein Vektor

Der Bereich ist 0 bis 63, was sicherlich nicht "zu lang" ist. Und ich bekomme diesen Fehler nicht, wenn ich die Spalte mit einem int spezifiziere.

Außerdem habe ich meine neue Funktion getestet, indem ich nur einen Spaltennamen geschrieben habe, anstatt die Variable col_num zu verwenden, und es hat perfekt funktioniert. (HR ist ein Spaltenname.):

makeHRdata = function(Test, model, col_num) { 
    means = 1:length(Test) 
    for (i in 1:length(Test)) means[i] = mean(Test[,i]) 
    TestCopy = Test[1,] 
    TestCopy[1,] = t(means) 
    pdpHR = range(Test$HR) 
    for (i in range(Test$HR)[1]:range(Test$HR)[2]) { 
    TestCopy$HR[1] = i 
    pdpHR[i] = predict(model,TestCopy) 
    } 
    return(pdpHR) 
} 

Jede Idee, was ich kann in dem Spaltennamen als String übergeben tun und haben alles funktionieren? Vielen Dank!

Antwort

1

Dies ist ein lustiger Fehler. Sehen Sie diese zur Erklärung:

> df <- data.frame(a = 1:10) 
> range(df$b) 
[1] Inf -Inf 
Warning messages: 
1: In min(x, na.rm = na.rm) : 
    no non-missing arguments to min; returning Inf 
2: In max(x, na.rm = na.rm) : 
    no non-missing arguments to max; returning -Inf 

So offensichtlich, wenn Sie Test$col_num nennen es nicht col_num erkennt eine Variable zu sein. Es sucht nach der Spalte "col_num", die NULL ist. Die range wird zu [-Inf, Inf] und Sie sehen die Warnungen nicht, da sie innerhalb der Funktionsumgebung ausgeführt wird. Und natürlich ist der Vektor -Inf:Inf viel zu groß.

Hier ist das Update (und die Art und Weise Spalten durch Variablen zu nennen): Test[[col_num]] statt Test$col_num verwenden.

+0

Das hat funktioniert! War ein lustiger Fehler, haha. Vielen Dank für deine Hilfe! –