サンドボックス環境で使用したい特別な (ダミー) 関数があります。
disable.system.call <- function(...) {
mc <- match.call()
if (grepl('system', deparse(mc[[2]])))
stop('NONO')
eval(mc, env = .GlobalEnv)
}
system
最初の引数の名前に単語が含まれているかどうかをチェックするだけで、特別なことは何もしません。これは単なる POC の例です。
base
後で行うこと: この単純な関数をいくつかの関数と関数に割り当ててstats
、評価された式system
に最初の引数として単語が含まれているかどうかを確認します。例えば:
e <- new.env()
eval(parse(text = 'model.frame <- disable.system.call'), envir = e)
system
内部のない呼び出しは魅力のように機能するため、これは非常にクールに機能しますが、フィルターは機能します。
> eval(parse(text = 'model.frame("1 ~ 1")'), envir = e)
1
1 1
> eval(parse(text = 'model.frame(\'1 ~ system("ls -la")\')'), envir = e)
Error in model.frame("1 ~ system(\"ls -la\")") : NONO
文字列のような式が見つかった内部でlm
呼び出す呼び出しでも動作しています:model.frame
> eval(parse(text = 'lm(\'1 ~ system("ls -la")\')'), envir = e)
Error in model.frame(formula = "1 ~ system(\"ls -la\")", drop.unused.levels = TRUE) :
NONO
もう少し先に進んで、from から呼び出される非常に単純な関数 ( disable.system.call
) を割り当てました。残念ながら、私はこれまでのところ得ていません:as.formula
model.frame
> e <- new.env()
> eval(parse(text = 'as.formula <- disable.system.call'), envir = e)
> eval(parse(text = 'as.formula("1 ~ 1")'), envir = e)
1 ~ 1
> eval(parse(text = 'as.formula(\'1 ~ system("ls -la")\')'), envir = e)
Error in as.formula("1 ~ system(\"ls -la\")") : NONO
> eval(parse(text = 'model.frame(\'1 ~ system("ls -la")\')'), envir = e)
1 system("ls -la")
1 1 0
> eval(parse(text = 'lm(\'1 ~ system("ls -la")\')'), envir = e)
Call:
lm(formula = "1 ~ system(\"ls -la\")")
Coefficients:
(Intercept) system("ls -la")
1 NA
私が知ってmodel.frame
いるように呼び出しas.formula
ていますが、これは機能しません (上記の出力からわかるように)。カスタム環境で上記のようにmodel.frame
呼び出しているためではstats::as.formula
ないと確信しています。lm
model.frame
ヒントやアイデアは大歓迎です!