【问题标题】:preserve inputParser.Results through parse (do not revert to defaults)通过解析保留 inputParser.Results(不要恢复为默认值)
【发布时间】:2016-08-13 06:59:16
【问题描述】:

我正在使用inputParser 来解析键值对。我想运行parse 来获取新传入的键值对,但这会覆盖整个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 用默认值覆盖以前的非默认值。我的第一个想法是保存第一组值,然后将它们重新插入 parser.Results,但我发现You cannot set the read-only property 'Results' of inputParser

我能看到的唯一解决方案是将第一组结果中的非默认、非重新给出的参数作为键值对添加到 varargin,但这听起来很混乱。

有没有更好的办法?

【问题讨论】:

    标签: matlab parsing key-value overwrite optional-parameters


    【解决方案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 上测试。

    【讨论】:

    • 感谢您,这对您有很大帮助。但是,它确实取决于默认值 nan。在我的示例中没有解决这个问题是我的错,但理想情况下,我宁愿与解析器中设置的默认值进行比较。我会看看我是否能解决这个问题并将其添加到您的答案中。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多