Аргументы команды Verbatim: deparse (заменитель (foo)) в оболочке - PullRequest
5 голосов
/ 12 января 2011

Вот небольшая загадка для тех, кто свободно разбирается в том, как R-оценщик обрабатывает вызовы функций.Предположим, я хотел написать функцию, которая принимает оператор R, такой же, как то, что я написал бы в командной строке, и отображает как его, так и вычисленный результат.Пример:

 > p.eval(sum(1:3))
 sum(1:3) --> 6

Это просто;вот определение p.eval():

p.eval <- function(v,prefix="--> ") { 
   cmd <- deparse(substitute(v)); cat(cmd,prefix,v,"\n") 
}

Но предположим, что теперь я хочу написать обертку вокруг p.eval, которая будет вызываться таким же образом;возможно, как несколько сумасшедший бинарный оператор с фиктивным вторым аргументом:

%PE% <- function(x,...) p.eval(x)

Я хотел бы вызвать его так: sum(1:3) %PE% 0 должен быть эквивалентен старому p.eval(sum(1:3)).Конечно, это не работает, потому что deparse(substitute()) из p.eval() теперь задает x.

Вопрос для просвещенных: есть ли способ сделать эту работу, как я желаю? .. ДляВ этом конкретном случае я вполне могу определить %PE%, скопировав / вставив однострочное определение p.eval, поэтому этот вопрос носит в основном академический характер.Может быть, я узнаю кое-что о мелочах оценщика R:)

PS: Почему могут оказаться полезными вышеуказанные функции? .. Предположим, я разработал некоторый код анализа и вызвал его неинтерактивно через org-babel (с которым определенно стоит поиграть, если вы работаете в режиме Org и / или в Emacs).По умолчанию, org-babel выскальзывает из вывода, так как вещи интерпретируются в интерпретаторе.Таким образом, если я хочу получить что-то кроме необработанных чисел, я должен явно создать строки, которые будут напечатаны через cat или paste, но кто хочет сделать это, когда они летят через анализ? .. Хак выше позволяетпросто добавить% PE% 0 после строки, которую вы хотите напечатать, и это выведет команду на вывод org.

Ответы [ 2 ]

11 голосов
/ 12 января 2011

Попробуйте это:

> "%PE%" <- function(x, ...) do.call(p.eval, list(substitute(x)))
> sum(1:3) %PE% 0
sum(1:3) -->  6 
1 голос
/ 12 января 2011

Также можно просто вернуть p.eval "v", а затем:

 p.eval <- function(v,prefix="--> ") {
        cmd <- deparse(substitute(v)); cat(cmd,prefix,v,"\n") ; return(v)  } 
"%PE%" <- function(x, y=NULL) x 
 sum(1:3) %PE% Inf
 #[1] 6  
sum(1:3) %PE%   # won't accept single argument
  r   # give it anything
 #[1] 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...