Was ist "Objekt des Typs 'Schließung' ist nicht Teilmenge" Fehler in Shiny?

8

Ich habe eine glänzende App und wenn ich sie ausführe, erhalte ich eine Fehlermeldung, dass object of type ‘closure’ is not subsettable . Was ist das und wie kann ich es beheben?

Hinweis : Ich habe diese Frage geschrieben, da dies sehr häufig vorkommt und die möglichen Betrüger entweder nicht shiny verwandt oder so spezifisch sind, dass es nicht offensichtlich ist, dass die Antworten breit anwendbar sind.

    
John Paul 16.11.2016, 03:50
quelle

1 Antwort

21

Siehe auch diese Frage Dieser Fehler wird in einem Nicht-Shiny-Kontext behandelt.

So beheben Sie das Problem:

Dies ist ein sehr häufiger Fehler in glänzenden Apps. Dies tritt am häufigsten auf, wenn Sie ein Objekt wie beispielsweise list , data.frame oder vector mit der Funktion reactive() erstellen, dh Ihr Objekt reagiert auf eine Art von Eingabe. Wenn Sie das tun, wenn Sie später auf Ihr Objekt verweisen, müssen Sie Klammern enthalten.

Nehmen wir zum Beispiel an, Sie machen eine reaktive data.frame wie folgt:

%Vor%

Wenn Sie dann auf data.frame verweisen möchten und Sie MyDF oder MyDF$X nennen, erhalten Sie den Fehler. Stattdessen sollte es MyDF() oder MyDF()$X sein. Sie müssen diese Namenskonvention für jedes Objekt verwenden, das Sie mit reactive() erstellen.

Warum das passiert:

Wenn Sie ein reaktives Objekt wie data.frame mit reactive() erstellen, ist es verlockend, es wie jedes andere nicht-reaktive data.frame zu betrachten und Ihren Code entsprechend zu schreiben. Was Sie jedoch erstellt haben, ist nicht wirklich ein data.frame. . Stattdessen haben Sie eine Anleitung in Form einer Funktion , die Ihnen zeigt, wie Sie das data.frame erstellen können, wenn es benötigt wird . Wenn Sie diese Funktion tatsächlich verwenden möchten, um data.frame zu erhalten, müssen Sie die Klammern verwenden, genau wie jede andere Funktion in R. Wenn Sie vergessen, die Klammer zu verwenden, denkt R, dass Sie versuchen, einen Teil einer Funktion zu verwenden und gibt dir den Fehler. Versuchen Sie Folgendes einzugeben:

%Vor%

in der Befehlszeile und Sie erhalten den gleichen Fehler.

Dieser Fehler wird möglicherweise nicht direkt beim Start der App angezeigt. Reaktive Objekte haben eine sogenannte "faule" Bewertung. Sie werden erst ausgewertet, wenn sie für eine bestimmte Ausgabe benötigt werden. Wenn also data.frame nur zum Erstellen eines Plots verwendet wird, ist data.frame nicht vorhanden, bis der Benutzer den Plot zum ersten Mal sieht. Wenn der Benutzer beim Start der App auf eine Schaltfläche klicken oder die Tabs wechseln muss, um die Handlung zu sehen, wird der Code für data.frame erst ausgewertet, wenn dies der Fall ist. Sobald dies der Fall ist, wird dann und nur dann glänzend die aktuellen Werte der Eingaben verwendet, um die Funktion auszuführen, die das data.frame erstellt, das zum Erstellen des Plots benötigt wird. Wenn Sie vergessen haben, die Klammern zu verwenden, wird Ihnen der Fehler angezeigt. Beachten Sie, dass die Funktion, die data.frame erstellt, nicht erneut ausgeführt wird, wenn sich die Eingaben ändern, der Benutzer jedoch das Diagramm nicht betrachtet, bis der Benutzer das Diagramm erneut betrachtet.

    
John Paul 16.11.2016, 03:50
quelle

Tags und Links