Хотя я не могу говорить о лучших практиках, я собираюсь дать одну возможную структуру для этой задачи, которая, как мне кажется, учитывает варианты написания. Это метод, который используется в некоторых базовых функциях R
для вероятностных распределений, когда есть альтернативные параметризации распределения (например, в гамма-распределении вы можете указать параметр масштаба или скорости). В этих случаях функция включает оба аргумента, а затем использует хитроумный набор команд, чтобы гарантировать, что функция будет использовать любой аргумент, указанный пользователем.
Чтобы создать функцию, используя centre
и centre
как варианты написания того же аргумента, вы можете использовать структуру, показанную ниже. Обратите внимание, что вычисления в этом методе выполняются с использованием варианта написания второй , и этот последний аргумент устанавливается равным первому аргументу в значениях по умолчанию для функции. Это гарантирует, что функция будет использовать указанный пользователем аргумент.
MY_FUNCTION <- function(centre = 0, center = centre, ...) {
#Check inputs
if (!missing(centre) && !missing(center)) {
if (sum((centre - center)^2) < 1e-15) {
warning("specify 'centre' or 'center' but not both") } else {
stop("Error: specify 'centre' or 'center' but not both") } }
Do some computations using the 'center' argument and then give output }
Вот пример этой структуры функции, применяемой для создания функции DISTANCE
, которая вычисляет евклидово расстояние между точкой и центром / center.
DISTANCE <- function(point, centre = 0, center = centre, ...) {
#Check inputs
if (!missing(centre) && !missing(center)) {
if (sum((centre - center)^2) < 1e-15) {
warning("specify 'centre' or 'center' but not both") } else {
stop("Error: specify 'centre' or 'center' but not both") } }
sqrt(sum((point - center)^2)) }
В приведенных ниже примерах мы демонстрируем, что эта структура работает правильно независимо от того, использует ли пользователь аргумент centre
или аргумент center
. В патологическом случае, когда пользователь указывает оба аргумента (чего на самом деле не следует), функция сравнивает значения center
и centre
; если значения близки друг к другу, функция продолжается, но выдает предупреждение пользователю не указывать оба аргумента; если значения не близки друг к другу, функция останавливается и выдает сообщение об ошибке, предлагающее пользователю не указывать оба аргумента.
POINT <- c(4, 2, 3);
CENT <- c(0, 3, 1);
DISTANCE(point = POINT, centre = CENT);
[1] 4.582576
DISTANCE(point = POINT, center = CENT);
[1] 4.582576
DISTANCE(point = POINT, centre = CENT, center = CENT);
[1] 4.582576
Warning message:
In DISTANCE(point = POINT, centre = CENT, center = CENT) :
specify 'centre' or 'center' but not both
DISTANCE(point = POINT, centre = CENT, center = CENT + 1);
Error in DISTANCE(point = POINT, centre = CENT, centre = CENT + 1) :
Error: specify 'centre' or 'center' but not both