Определите, должен ли проанализированный ввод varargin передаваться в качестве аргумента, а не анализироваться внутри каждой функции - PullRequest
0 голосов
/ 12 июня 2018

У меня есть набор функций, который принимает массив ячеек таблиц и выводит данные из каждой таблицы в качестве подзаговора на фигуре.Я учился использовать класс inputParser для обработки varargin входов, и здесь это есть.Необязательные параметры предназначены для выбора типа графика (plot или bar) и для выбора имен переменных для построения графика из таблиц ввода.

В моем сценарии входные данные должны передаваться примерно3 функции глубоко, так что я задаюсь вопросом о лучших методах для этого.В моей текущей настройке самая внешняя функция (main) принимает вход varargin и анализирует входы, назначая значения по умолчанию и тому подобное.Тогда мне интересно, когда приходит время передать эти входные данные следующей функции, лучше ли передать структуру данных parsedInputs Results по строке или лучше, чтобы следующая функция также взяла vararginаргумент и повторить процесс синтаксического анализа снова?Я не уверен, что лучший способ это сделать.Мой код ниже.Основной сценарий для целей тестирования выглядит следующим образом:

% RUN TEST CASE
Tables{1} = table([1 2 3]' , [6 7 8]', 'VariableNames', {'diam', 'length'});
Tables{2} = table([1 2 6]' , [6 9 2]', 'VariableNames', {'diam', 'length'});
Tables{3} = table([3 9 11]', [7 4 1]', 'VariableNames', {'diam', 'length'});
main(Tables);

Основная функция принимает (обязательный) массив ячеек таблиц (Tables) и переменные параметры аргумента, такие как 'xVariable', 'yVariable''plotType'.

function main(Tables, varargin)%PlotParams, DICTS)
  % parse inputs
  parsedInputs = parse_plot_inputs(Tables, varargin);

  % create figure of subplots
  figure;  
  make_subplots_from_tables(parsedInputs);
end

Функция parse_plot_inputs заботится о присвоении значений по умолчанию и т. Д.:

function parsedInputs = parse_plot_inputs(Tables, vararginList)
% input parser function for this specific plotting case
  p = inputParser;
  addRequired(p,  'Tables', @iscell);
  addParameter(p, 'xVariable', 'diam');
  addParameter(p, 'yVariable', 'length');
  addParameter(p, 'plotType', 'plot');
  parse(p, Tables, vararginList{:});
  parsedInputs = p;
end

make_subplots_from_tables, затем циклически перебирает массив ячеек таблиц и вызывает plot_special для построения каждого из них на отдельном участке.

function make_subplots_from_tables(parsedInputs) 

  % unpack parsed inputs
  Tables = parsedInputs.Results.Tables;

  % plot each table as a subplot
  numTables = length(Tables);
  for i = 1:numTables      
      subplot(numTables, 1, i); hold on;
      plot_special(Tables{i}, parsedInputs)
  end
end

plot_special - это «базовая» функция в этом сценарии, которая вызывает функции графика MATLAB:

function plot_special(T, parsedInputs)

  % unpack parsed inputs
  xVariable = parsedInputs.Results.xVariable;
  yVariable = parsedInputs.Results.yVariable;
  plotType  = parsedInputs.Results.plotType;

  % plot single table on one plot
  xVals = T.(xVariable);
  yVals = T.(yVariable);
  switch plotType
    case 'plot'
      plot(xVals, yVals, '-x');
    case 'bar'
      bar(xVals, yVals);
    otherwise
      error('invalid plot type');
  end
end

Яне уверены, является ли это лучшим методом для принятия аргументов и использования их в последующих функциях.Этот метод работает, хотя я не уверен, что это лучшая практика, и не самая гибкая, например, учитывая сценарий, когда я хотел бы использовать plot_special самостоятельно, и хотел бы иметь возможность передавать ему аргументы для xVariable, yVariable и т. Д. При необходимости.Учитывая, что в настоящее время он зависит от списка parsedInputs из функции main, это невозможно сделать.Тем не менее, я не уверен, каким будет другой способ определить это.Я подумал о том, чтобы встроить оператор if вместе с входным аргументом varargin, который проверяет, является ли varargin уже проанализированной структурой, или он получает переменные напрямую и должен сам вызвать parse_plot_inputs, чтобы все заработало,Любой совет был бы великолепен.

1 Ответ

0 голосов
/ 12 июня 2018

Единого «лучшего» метода не существует, все зависит от обстоятельств.То, что вы делаете, хорошо, если функции, которые принимают объект inputParser, являются частными подфункциями.Если они являются общими функциями, которые должны работать независимо, у них должен быть свой собственный анализ аргументов.Одна вещь, которую вы можете сделать, учитывая, что вы хотите, чтобы plot_special была автономной функцией, была следующей:для каждой построенной таблицы, а не только один раз для всего графика.Это, вероятно, очень незначительная проблема, поскольку разбор параметров не так дорог, как построение графиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...