web-dev-qa-db-fra.com

Erreur lors de l'installation: impossible de contraindre le type 'fermeture' au vecteur de type 'caractère'

J'ai essayé d'installer tous les packages liés à rattle en tapant:

install.packages(rattle, dependencies = c("Depends","Suggests"))

et j'ai eu ça

Installing package into ‘C:/Users/Hooman/Documents/R/win-library/3.1’
(as ‘lib’ is unspecified)
Error in as.character(x) : 
  cannot coerce type 'closure' to vector of type 'character'

J'ai déjà installé deux packages individuels dans ce dossier et je n'ai eu aucun problème.

15
user7789

@BenBolker a posté une réponse sous forme de commentaire, peut-être parce qu'il espère que vous regarderez la différence entre votre code et le sien et obtiendrez un moment zen. Il pense également, étant le gentleman modeste qu'il est, qu'il est trop simple de justifier des votes positifs. Je me sens donc coupable que toutes les voix positives soient les siennes plutôt que les miennes. Je vais maintenant essayer de gagner légitimement des votes positifs.

La raison de l'erreur est le install.packages la fonction attend un objet caractère, tandis que vous lui avez donné l'expression non citée rattle. Ben utilise un vecteur de caractère à élément unique "rattle", répondant ainsi à l'exigence de la fonction. Contrairement à certaines fonctions install.packages n'est pas équipé pour fournir une "évaluation non standard" de son premier argument.

R est parfois un langage amusant avec des conventions d'évaluation incohérentes. Il existe plusieurs fonctions dans lesquelles vous pouvez fournir une expression sans guillemets et la convertir automatiquement en caractère. La liste comprend library, et son cousin, require, ainsi que help, subset et $. Celles-ci sont considérées comme une évaluation "non standard" par des utilisateurs avertis et elles peuvent avoir leurs pièges dans la programmation. Le message d'erreur vous indique que R a essayé de convertir ce qu'il "pensait" être un objet langage, une fermeture (qui est vaguement un terme R et LISP pour une fonction), en un caractère et n'a pas réussi. Vous pouvez voir la même erreur avec cette interaction de console:

> as.character(mean)
Error in as.character(mean) : 
  cannot coerce type 'closure' to vector of type 'character'

Si vous regardez la fonction library mentionnée par Ben et faites défiler les définitions des fonctions internes, vous obtenez finalement le mécanisme par lequel la bibliothèque évite cette erreur:

if (!character.only) 
            package <- as.character(substitute(package))

Cela éviterait également l'erreur, que j'ai intentionnellement utilisée comme exemple:

> as.character(substitute(mean))
[1] "mean"

La fonction substitute effectue un traitement sur un élément de langage considéré comme une fermeture et l'objet résultant un "nom" R a un as.character méthode.

24
42-