別のユーザーから渡された文字列に対して eval の呼び出しを開始した場合にのみ、セキュリティ上の問題が実際に発生します。eval
バックグラウンドで R を実行するアプリケーションを作成している場合、これは大きな問題ですが、自分で実行するコードを記述しているデータ分析では、セキュリティへの影響を心配する必要はありません。
ただし、その他のいくつかの問題eval(parse(
。
まず、eval-parse を使用するコードは通常、解析されていないコードよりもデバッグがはるかに困難です。これは、ソフトウェアのデバッグが、最初にコードを記述するよりも2 倍難しいため、問題になります。
ここに間違いのある関数があります。
std <- function()
{
mean(1to10)
}
愚かなことに、コロン演算子を忘れて、ベクトルを間違って作成してしまいました。この関数を source しようとすると、R は問題に気づき、エラーをスローして、間違いを指摘します。
これが eval-parse バージョンです。
ep <- function()
{
eval(parse(text = "mean(1to10)"))
}
エラーは有効な文字列内にあるため、これが発生します。エラーがスローされるのは、後でコードを実行するときだけです。したがって、eval-parse を使用すると、ソース時のエラー チェック機能が失われます。
また、関数のこの 2 番目のバージョンは、はるかに読みにくいと思います。
eval-parse のもう 1 つの問題は、直接実行されるコードよりもはるかに遅いことです。比較
system.time(for(i in seq_len(1e4)) mean(1:10))
user system elapsed
0.08 0.00 0.07
と
system.time(for(i in seq_len(1e4)) eval(parse(text = "mean(1:10)")))
user system elapsed
1.54 0.14 1.69