Программирование функций R, учитывающих варианты написания - PullRequest
0 голосов
/ 05 августа 2020

Предположим, вы хотите запрограммировать функцию R, которая использует аргумент с различными возможными написаниями (например, используя аргументы centre и center из Briti sh и US Engli sh соответственно). Вы хотите, чтобы функция позволяла пользователю использовать любое написание, но рассматривалась по существу как один аргумент. Как лучше всего структурировать такую ​​функцию?

1 Ответ

1 голос
/ 05 августа 2020

Хотя я не могу говорить о лучших практиках, я собираюсь дать одну возможную структуру для этой задачи, которая, как мне кажется, учитывает варианты написания. Это метод, который используется в некоторых базовых функциях 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...