J'ai une application brillante et lorsque je l'exécute, j'obtiens une erreur indiquant qu'un object of type ‘closure’ is not subsettable
. Qu'est-ce que c'est et comment puis-je y remédier?
Note: J'ai écrit cette question car cela revient souvent, et les dupes possibles ne sont pas liées à shiny
ou si spécifiques qu'il n'est pas évident que les réponses soient largement applicables.
Voir aussi cette question qui couvre cette erreur dans un contexte non brillant.
Comment résoudre ce problème:
Il s'agit d'une erreur très courante dans les applications brillantes. Cela apparaît généralement lorsque vous créez un objet tel qu'un list
, data.frame
Ou vector
à l'aide de la fonction reactive()
- c'est-à-dire que votre objet réagit à une sorte d'entrée. Si vous faites cela, lorsque vous faites référence à votre objet par la suite, vous devez inclure des parenthèses.
Par exemple, disons que vous créez un data.frame
Réactif comme ceci:
MyDF<-reactive({ code that makes a data.frame with a column called “X” })
Si vous souhaitez faire référence au data.frame
Et que vous l'appelez MyDF
ou MyDF$X
, Vous obtiendrez l'erreur. Au lieu de cela, il doit être MyDF()
ou MyDF()$X
Vous devez utiliser cette convention de dénomination avec tout objet que vous créez à l'aide de reactive()
.
Pourquoi cela se produit:
Lorsque vous créez un objet réactif, tel qu'un data.frame
, En utilisant reactive()
, il est tentant de le considérer comme tout autre data.frame
Non réactif et d'écrire votre code en conséquence. Cependant, ce que vous avez créé n'est pas vraiment un data.frame.
Ce que vous avez fait est plutôt des instructions , sous la forme d'une fonction , qui expliquent comment faire le data.frame
quand il est nécessaire. Lorsque vous souhaitez réellement utiliser cette fonction pour obtenir le data.frame
, Vous devez utiliser les parenthèses, comme vous le feriez pour toute autre fonction dans R. Si vous oubliez d'utiliser les parenthèses, R pense que vous essayez d'utiliser la partie d'une fonction et vous donne l'erreur. Essayez de taper:
plot$x
sur la ligne de commande et vous obtiendrez la même erreur.
Vous ne verrez peut-être pas cette erreur au démarrage de votre application. Les objets réactifs ont ce qu'on appelle une évaluation "paresseuse". Ils ne sont évalués que lorsqu'ils sont nécessaires pour une sortie. Donc, si votre data.frame
N'est utilisé que pour créer un tracé, le data.frame
N'existera pas tant que l'utilisateur n'aura pas vu le tracé pour la première fois. Si, au démarrage de l'application, l'utilisateur doit cliquer sur un bouton ou changer d'onglet pour voir le tracé, le code du data.frame
Ne sera évalué qu'après cela. Une fois que cela se produit, alors et alors seulement, brillant utilisera les valeurs actuelles des entrées pour exécuter la fonction qui construit le data.frame
Nécessaire pour créer le tracé. Si vous avez oublié d'utiliser les parenthèses, c'est lorsque brillant vous donnera l'erreur. Notez que si les entrées changent, mais que l'utilisateur ne regarde pas le tracé, la fonction qui fait le data.frame
Ne sera pas réexécutée jusqu'à ce que l'utilisateur revoie le tracé.