Вот небольшая загадка для тех, кто свободно разбирается в том, как 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.