Я немного новичок в 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: -)