У меня есть специальная (фиктивная) функция, которую я хочу использовать в изолированном среде:Scoping (функция) в пользовательской среде
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
Я попытался пойти немного дальше и назначен, что довольно простая функция (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
в пользовательской среде.
Любые подсказки и идеи будут действительно приветствоваться!
Спасибо, этот ответ слишком удобно (+1)! На самом деле я не хочу запрещать все «системные» вызовы, это был просто простой пример POC, но я действительно хочу реализовать среду песочницы. Pls см .: http://sandboxr.no-ip.org/ В любом случае, 'assignInNamespace' кажется многообещающим, мне нужно некоторое время, чтобы сделать некоторые эксперименты после Пасхи и, безусловно, дать более подробную обратную связь. – daroczig
Хороший проект. Вы видели Live-R, что делает подобное? http://live-analytics.com –
Никогда не слышал о Live-R, спасибо, что обратил мое внимание на эту аккуратную часть программного обеспечения! Я на самом деле что-то подобное, но со специальной (ожидаемой) аудиторией. Мы увидим :) Во всяком случае, о вашем ответе: поскольку '? AssignInNamespace' предлагает не использовать эту функцию в пакете (например, я бы хотел) и не разрешает включать/отключать среду песочницы, кажется, что у меня есть найти другой способ деактивации этих вызовов. Как и источники grep'ing R для подобных функций :) Что я хочу сделать, так это запускать вызовы в специальной среде, за исключением того, что разрешено что-либо (для вызовов на стороне системы). – daroczig