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.
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:
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:
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.