Передать неоцененные команды функции в R - PullRequest
4 голосов
/ 05 февраля 2011

Я немного новичок в R, и я застрял в том, что кажется простой проблемой, но затрагивает довольно глубокие вопросы о том, как и когда все оценивается в R.

Я немного использую Rserve; Типичный синтаксис для удаленной оценки объектов - это немного сложно набирать повторно:

RSeval(connection, quote(try(command)))

Итак, я хотел бы функцию r, которая делает то же самое с помощью только вызова:

r(command)

Моя первая наивная попытка провалилась:

r <- function(command) {
    RSeval(c, quote(try(command)))
}

Вы уже догадались: это буквально try(command) отправляет моему запутанному демону Rserve. Я хочу, чтобы command был частично оценен, если это имеет какой-то смысл - то есть заменен на то, что я набрал в качестве аргумента, но без локальной оценки.

Я искал решения для этого, просматривал документацию для цитаты, замены, eval, вызова и т. Д., Но я не смог найти что-то, что сработало. Либо command оценивается локально, либо не выполняется вообще.

Это не большая проблема, я могу печатать всю эту чертову quote(try()) вещь все время; но сейчас мне больше всего интересно, как заставить это работать!

EDIT: Больше объяснений относительно того, что я хочу сделать.

  • В вышеприведенном тексте command предназначен для вызова функции, в идеале - т.е. не для строки символов. Что-то вроде a <- 3 или assign("a", 3), а не "a<-3" или quote(a<-3). Я считаю, что это является частью того, что делает это сложно. Кажется, действительно трудно сказать R не оценивать это локально, а только посылать это буквально. По сути, я бы хотел, чтобы моя функция была немного похожа на quote(), которая не оценивает его аргумент.
  • Некоторые пояснения о моих намерениях. Я хочу часто использовать Rserve для передачи команд удаленному демону R. Команды будут моими (или моими коллегами) и демоном, защищенным брандмауэром и аутентификацией (и не будут выполняться от имени пользователя root), поэтому не стоит беспокоиться о том, что вредоносные команды будут переданы.
  • Если честно, это не большая проблема, и я был бы очень рад всегда использовать RSeval(c, quote(try())). На данный момент я вижу это больше как интересное исследование возможностей R: -)

Ответы [ 2 ]

4 голосов
/ 05 февраля 2011

Возможно, вы захотите использовать команду замены, она может дать вам неоцененный аргумент, который можно встроить в вызов.

0 голосов
/ 05 февраля 2011

Я не уверен, правильно ли я вас понял - eval(parse(text = command)) сработает?Обратите внимание, что command является символом, поэтому вы можете легко передать его в качестве аргумента функции. Если Я понял (а) ...

В любом случае, оценка пользовательских команд потенциально опасна, поэтому не рекомендуется.Вам следует либо установить AppArmor и настроить его (что не так-то просто), либо отказаться от всего процесса оценки ...

...