Дословные аргументы команды: deparse (replace (foo)) в оболочке

Вот небольшая загадка для тех, кто хорошо разбирается в том, как оценщик 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 (сумма (1: 3)) . Это, конечно, не работает, потому что deparse (substitute ()) из p.eval () теперь дает x .

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

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

Файловая система не имеет элемента: Файл не найден: транзакция '43999 -6 ', path' / path / to / folder 'в / usr / local / git / libexec / git-core / git-svn line 572

Я попытался добавить папку обратно, но продолжаю получать эту ошибку. я могу удалить коммит из дерева, чтобы обойти это? Не знаю, что еще здесь делать.

редактировать
некоторые из следующих вопросов не полностью отвечают на мой вопрос, но, похоже, они в правильном направлении:

Последняя проблема, похоже, была тем, что я хотел, но с размером моего репо (в прошлый раз, мне потребовался целый рабочий день, чтобы проверить все это), и небольшой объем работы, который я потерял бы, просто выполнив жесткий сброс (который в конечном итоге, казалось, сработал), я пошел на параметр жесткого сброса.

7
задан Community 23 May 2017 в 12:21
поделиться