Qu'est-ce que “l'objet de type "fermeture" n'est pas subsettable” erreur de Shiny?
J'ai une brillante application et quand je le lance j'ai une erreur de dire qu'un object of type ‘closure’ is not subsettable
. Qu'est-ce que cela et comment puis-je résoudre ce problème?
Note: j'ai écrit cette question car cela revient beaucoup, et la possible dupes ne sont pas shiny
liées ou si spécifique qu'il n'est pas évident que les réponses sont largement applicables.
encore une dupe, la même erreur se produit, vous ne pouvez pas sous-ensemble d'un dispositif de fermeture (fonction), n'a rien à voir avec brillant
Je suis plutôt d'accord avec @rawr que l'erreur n'est pas liée à brillant, c'est juste que c'est rencontré beaucoup au sein de brillant. L'explication dans votre réponse est utile, cependant.
Je pense que la différence est que beaucoup de nouveaux brillant, les utilisateurs ne pense réactif
alors pourquoi arent brillant utilisateurs de lire le manuel?
(function() {})$x
et l'explication est inutile, reactive
retourne une fonction, donc mfDF$x
est d'essayer de sous-ensemble d'une fonction qui vous ne pouvez pas faireJe suis plutôt d'accord avec @rawr que l'erreur n'est pas liée à brillant, c'est juste que c'est rencontré beaucoup au sein de brillant. L'explication dans votre réponse est utile, cependant.
Je pense que la différence est que beaucoup de nouveaux brillant, les utilisateurs ne pense réactif
data.frames
etc comme des fonctions, mais plutôt comme data.frames
. Alors, quand ils voient un non brillant réponse qui traite des fonctions qu'il n'est pas clair comment cela s'applique. Cela dit, je suis d'accord c'est le même problème, mais je pense que d'une question différente, c'est utile aussi bien.alors pourquoi arent brillant utilisateurs de lire le manuel?
?shiny::reactive
dit Value a function, wrapped in a S3 class "reactive"
OriginalL'auteur John Paul | 2016-11-16
Vous devez vous connecter pour publier un commentaire.
Voir aussi cette question qui couvre cette erreur dans un non Brillant contexte.
Comment résoudre ce problème:
C'est une erreur très commune en brillant apps. Cette plupart apparaît généralement lorsque vous créez un objet tel qu'un
list
,data.frame
ouvector
à l'aide de lareactive()
fonction – qui est, votre objet réagit à certains commentaires. Si vous faites cela, lorsque vous vous référez à votre objet par la suite, vous devez inclure les parenthèses.Par exemple, disons que vous faites un réactif
data.frame
comme suit:Si vous souhaitez ensuite de se référer à la
data.frame
et vous l'appelezMyDF
ouMyDF$X
, vous obtiendrez l'erreur. Il devrait plutôt êtreMyDF()
ouMyDF()$X
Vous avez besoin pour utiliser cette convention de nommage avec n'importe quel objet que vous créez à l'aide dereactive()
.Pourquoi ce qui se passe:
Lorsque vous effectuez un réactif objet, tel qu'un
data.frame
, à l'aide dereactive()
il est tentant de penser que c'est juste comme tous les autres non-réactifdata.frame
et écrire votre code en conséquence. Cependant, ce que vous avez créé n'est pas vraiment undata.frame.
Plutôt, ce que vous avez fait est instructions, sous la forme d'une fonction, qui disent brillant combien de rendre ledata.frame
quand c'est nécessaire. Lorsque vous souhaitez utiliser cette fonction pour obtenir lesdata.frame
vous devez utiliser les parenthèses, comme vous le feriez de toute autre fonction dans R. Si vous oubliez d'utiliser les parenthèses, R pense que vous essayez d'utiliser une partie de la fonction et vous donne l'erreur. Essayez de taper:à la ligne de commande et vous obtiendrez la même erreur.
Vous ne pouvez pas voir cette erreur de droit lorsque votre application démarre. Les objets réactifs ont ce qu'on appelle “paresseux” de l'évaluation. Ils ne sont pas évalués jusqu'à ce qu'ils sont nécessaires pour certains sortie de. Donc, si votre
data.frame
ne sert qu'à faire un complot, ledata.frame
pas exister jusqu'à ce que l'utilisateur voit l'intrigue pour la première fois. Si lorsque l'application démarre, l'utilisateur doit cliquer sur un bouton ou de changer les onglets pour voir l'intrigue, le code de ladata.frame
ne sera pas évalué jusqu'à ce qu'il se passe. Une fois que cela arrive, alors et alors seulement, brillant utiliser les valeurs actuelles des entrées pour exécuter la fonction qui construit l'data.frame
nécessaires pour rendre l'intrigue. Si vous avez oublié d'utiliser les parenthèses, c'est quand brillant vous donnera l'erreur. Notez que si les entrées de changement, mais l'utilisateur n'est pas en regardant le graphique, la fonction qui rend ladata.frame
ne sera pas ré-exécuter jusqu'à ce que l'utilisateur regarde l'intrigue de nouveau.OriginalL'auteur John Paul