2016-08-13 4 views
0

Я использую inputParser для анализа пар ключ-значение. Я хотел бы запустить parse, чтобы получить новые входящие пары ключ-значение, но это перезаписывает всю структуру Results. Вот демонстрация поведения против того, что я хочу:сохранить inputParser.Results через разбор (не возвращаться к значениям по умолчанию)

parser = inputParser 
addParameter(parser, 'param1', nan, @isnumeric); 
addParameter(parser, 'param2', nan, @isnumeric); 

parse(parser, ['param1', 1234]); 
% parser.Results is now {param1:1234, param2:nan} 
% all good so far. 

parse(parser, ['param1', 567]); 
% parser.Results now {param1:567, param2:nan} 
% this is also fine. 

parse(parser, ['param2', 89]); 
% parser.Results is now {param1:nan, param2:89} 
% what I want to have : {param1:567, param2:89} 

Короче я не хочу parse перезаписать предыдущие значения не по умолчанию, со значениями по умолчанию. Моя первая мысль состояла в том, чтобы сохранить первый набор значений, а затем снова вставить их в парсер. Результаты, но я обнаружил, что You cannot set the read-only property 'Results' of inputParser.

Единственное решение, которое я вижу, заключается в том, чтобы добавить непеременные параметры, не заданные по умолчанию, из первого набора результатов в varargin как пары ключ-значение, но это звучит как беспорядок.

Есть ли лучший способ?

ответ

1

Я думаю, что концептуальная проблема здесь относится к parser как к некоторому объекту хранения данных, в то время как его назначение различно - синтаксический анализ.

Моя идея о том, как исправить это предполагает поддержание отдельного struct (так называемый model), который удерживает последнее действительные (или по умолчанию) значения параметров. Затем, позвонив по номеру parse(), я посылаю parser.Results функции, updateParams, которая определяет действительные проанализированные параметры, а затем обновляет соответственно model.

function model = q38930125 
model = struct('param1',NaN,'param2',NaN); % This will hold our list of fields 

parser = inputParser; 
addParameter(parser, 'param1', NaN, @isnumeric); 
addParameter(parser, 'param2', NaN, @isnumeric); 

parse(parser, 'param1', 1234); 
% parser.Results is now {param1:1234, param2:nan} 
% all good so far. 
model = updateParams(parser.Results, model); 

parse(parser, 'param1', 567); 
% parser.Results now {param1:567, param2:nan} 
% this is also fine. 
model = updateParams(parser.Results, model); 

parse(parser, 'param2', 89); 
% parser.Results is now {param1:nan, param2:89} 
% what I want to have : {param1:567, param2:89} 
model = updateParams(parser.Results, model); 

end 

% Mutator of "model" based on the parse results 
function model = updateParams(parserResults, model) 
    fields = fieldnames(model); 
    for indF = 1:numel(fields) 
    tmp = parserResults.(fields{indF}); 
    if ~isnan(tmp) 
     model.(fields{indF}) = tmp; 
    end 
    end  
end 

Протестировано на MATLAB R2016a.

+0

Спасибо за это, это очень помогает. Однако он зависит от значений по умолчанию - nan. Это моя ошибка в том, что я не рассматриваю это в моем примере, но в идеале я бы скорее сравнил со значениями по умолчанию, установленными в синтаксическом анализаторе. Я посмотрю, смогу ли я это понять и добавить к вашему ответу. Еще раз спасибо! – 7yl4r