У меня есть набор функций, который принимает массив ячеек таблиц и выводит данные из каждой таблицы в качестве подзаговора на фигуре.Я учился использовать класс 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
, чтобы все заработало,Любой совет был бы великолепен.