Les problèmes de sécurité ne se posent réellement que si vous commencez à appeler eval sur des chaînes de caractères qu'un autre utilisateur vous a transmises. Il s'agit d'un problème important si vous créez une application qui exécute R en arrière-plan, mais pour l'analyse de données où vous écrivez du code à exécuter par vous-même, vous ne devriez pas avoir à vous soucier de l'effet de la fonction eval
sur la sécurité.
D'autres problèmes avec eval(parse(
cependant.
Tout d'abord, le code utilisant eval-parse est généralement beaucoup plus difficile à déboguer que le code non analysé, ce qui est problématique car les logiciels de débogage sont deux fois plus difficile que de l'écrire en premier lieu.
Voici une fonction qui contient une erreur.
std <- function()
{
mean(1to10)
}
Je suis stupide, j'ai oublié l'opérateur deux-points et j'ai créé mon vecteur de façon erronée. Si j'essaie de créer cette fonction, R remarque le problème et affiche une erreur, me montrant du doigt mon erreur.
Voici la version eval-parse.
ep <- function()
{
eval(parse(text = "mean(1to10)"))
}
Ce site sera car l'erreur se trouve dans une chaîne de caractères valide. Ce n'est que plus tard, lorsque nous exécutons le code, que l'erreur est levée. Ainsi, en utilisant eval-parse, nous avons perdu la possibilité de vérifier les erreurs à la source.
Je pense également que cette deuxième version de la fonction est beaucoup plus difficile à lire.
L'autre problème avec eval-parse est qu'il est beaucoup plus lent que le code directement exécuté. Comparez
system.time(for(i in seq_len(1e4)) mean(1:10))
user system elapsed
0.08 0.00 0.07
et
system.time(for(i in seq_len(1e4)) eval(parse(text = "mean(1:10)")))
user system elapsed
1.54 0.14 1.69