En R, nous pouvons charger des paquets avec:
library(knitr)
ou
library("knitr")
Dans ?library
, il dit que cet argument peut être un caractère ou un nom. Toutefois:
is.name(knitr)
Error: object "knitr" not found
class(knitr)
Error: object "knitr" not found
Cela complique également les choses quand un paquet contient une fonction qui est aussi le nom du paquet:
library(data.table)
class(data.table)
[1] "function"
library(data.table) #returns nothing
D'une certaine manière, il sait ne pas passer la fonction data.table
dans la fonction de bibliothèque, mais interprète plutôt comme un appel pour charger le paquet (je pense). Comment R gère-t-il cela?
Réponses:
2 pour la réponse № 1Les lignes pertinentes de library()
dire
if (!character.only)
package <- as.character(substitute(package))
Nous pouvons créer notre propre petite fonction (library()
c'est compliqué!) d'explorer comment cela fonctionne:
tmpf <- function(x) {
str(substitute(x))
}
tmpf(knitr)
## symbol knitr
Nous pouvons faire une chose équivalente en utilisant quote()
:
str(quote(knitr))
## symbol knitr
Mais en le passant à tmpf()
ne conserve pas sa forme, à cause de la substitute()
appel:
tmpf(quote(knitr))
## language quote(knitr)
Si nous devions mettre eval(substitute(x))
dans tmpf()
, nous aurions "objet knitr not found" quand nous aurions passé knitr
et un objet-symbole knitr
quand on est passé quote(knitr)
.
le character.only
argument à library()
est ce que vous utilisez si vous voulez passer une variable de chaîne dont valeur est "knitr"
;
str_var <- "knitr"
library(str_var,character.only=TRUE)