2012-01-31 7 views
15

Обычно я использую те же настройки функций. Мне интересно, есть ли метод, отличный от наличия нового объекта в пути, который по сути является оболочкой для функции, для установки аргументов по умолчанию. Например:Установка функции по умолчанию R на основе конкретного проекта

paste() имеет это sep аргумент установлен в пространстве =" ", я устал писать ,sep="" снова и снова. Итак, есть ли способ «временно» заменить функцию моими выбранными значениями по умолчанию?

paste(...,sep="") 

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

В идеале, я хотел бы что-то, что может быть установлен на проект по проектной основе в (load.r или какой-либо другой такой последовательности действий StartPoint)

+1

Для этого конкретного примера см. 'Paste0', введенный в R-devel. –

+2

Опять же, в этом конкретном случае 'ggplot2' имеет' ps', который завершает 'paste' с' sep = "" и 'collapse =" "'. Хотя я давно думал, что зависимость от 'ggplot2' немного для этой функции полезности. –

ответ

11

Defaults пакет используется, чтобы сделать это; ушел в отставку в 2014 году.

+3

На данный момент появляется ошибка, которая делает 'setDefaults (paste, sep =" ")' переходить в бесконечную рекурсию. Джефф сейчас на деле, фиксируя это. –

+0

еще не исправлено с 4 декабря 2013 года ... –

+0

* Пакет по умолчанию * был удален в 2014 году; не обновляется с R 3.0.x – smci

16

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

Я думаю, что - лучшее решение для создания аналогичных функций, реализующих ваши предпочтительные значения по умолчанию. Немного измененное имя будет эффективно отмечать, что это не знакомая базовая функция, не обременяя вас большим или дополнительным набором текста. Хорошим примером являются функции paste0() и cat0(), которые включены в пакет gsubfn. (Очевидно, вы и я не только два, чтобы найти себя (часто) раздражали по умолчанию sep настройки paste() «s!):

library(gsubfn) 

paste0 
# function (..., sep = "") 
# paste(..., sep = sep) 
# <environment: namespace:gsubfn> 

cat0 
# function (..., sep = "") 
# cat(..., sep = sep) 
# <environment: namespace:gsubfn> 

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

+0

Очень действительное рассмотрение. Вот почему я ищу что-то портативное. Очень редко кто-то использует мой код. Но все равно. –

+0

Я думаю, что любое разумное решение, которое вы найдете, потребует по крайней мере * одной * дополнительной строки кода в вашем скрипте. IMHO, это может быть также «source (« BBFuns.R »)» или «load (BBFuns)», где либо файл сценария, либо пакет содержат функции, которые вы хотите использовать. Трудно побить это для лаконичности * и переносимости *. И тогда есть * любой недостаток, чтобы называть вашу пересмотренную функцию, например, 'paste0', а не' paste'? –

+0

+1 Вот как я это делаю, как для дефолтов, так и для достаточно сложных команд, которые я не могу вспомнить. Еще одно преимущество заключается в том, что если у вас есть собственная функция wrapper/helper, вы можете легко изменить поведение * all * экземпляров кода, изменив его в одном месте. Вы также можете использовать функциональные возможности для разных версий, например. 'myPaste (..., ver = 2)', 'myPaste (..., ver = 3)'. – Iterator

 Смежные вопросы

  • Нет связанных вопросов^_^