Effacer les filtres
Effacer les filtres

puzzles on using mutiple "addOptional" in function definitions

14 vues (au cours des 30 derniers jours)
oracleyue
oracleyue le 9 Mar 2017
Modifié(e) : Zhe Chen le 1 Juil 2024 à 2:43
How to use multiple addOptional in function definitions? addOptional is to add positional arguments. So I want to use it in the following way.
  • First I define the function and use two addOptional there.
  • Then I thought I can call in the following two ways: myfunc('Jim', 12) and myfunc('Jim', 12, 'cm').However, the latter one throws an error:
The argument 'cm' is a string and does not match any parameter names. It failed validation for the argument 'units'.
But I can use as myfunc('Jim', 12, 'units', 'cm'), which seems the second addOptional behaves as addParameter, no longer like positional arguments. What's the mistake I made? Did I misunderstand something about addOptional? Many thanks!
Here is the definition of myfunc():
function myfunc(name, varargin)
par = inputParser;
defaultHeight = 1;
defaultUnits = 'inches';
defaultShape = 'rectangle';
expectedShape = {'square', 'rectangle', 'parallelogram'};
addRequired(par, 'name', @ischar);
addOptional(par, 'height', defaultHeight, @isnumeric);
addOptional(par, 'units', defaultUnits);
% addParameter(par, 'shape', defaultShape, ...
% @(x) any(validatestring(x,expectedShape)));
parse(par, name, varargin{:});
disp(par.Results)
---------
Updates:
I found that if the positional arguments are NOT literal string (maybe called as character array in helpdoc, the type shown by whos is char, e.g. 'any words'), there would be no problems. For example, use myfunc('Jim', 3, 4) which is defined as
function myfunc(name, varargin)
p = inputParser;
addRequired(p, 'name');
addOptional(p, 'i', 1);
addOptional(p, 'j', 2);
parse(p, name, varargin{:});
disp(p.Results)
The MATLAB help doc doesn't mention anything about the limitations in data types of additional positional arguments. Does it imply this is a bug?
Info:
  • MATLAB: 2016a
  • OS: OS X Sierra

Réponses (1)

Zhe Chen
Zhe Chen le 28 Juin 2024 à 17:29
Modifié(e) : Zhe Chen le 1 Juil 2024 à 2:43
I am having the exact same issue.
I think the official help document neglects two things:
1): The optional positional arguments can be called like a name-value argument.
myfunc('Jim', 12, 'units', 'cm') or myfunc('Jim', 12, units='cm')
2): If the value assigned to optional positional argument is a char vector or a string, it will not considered as an optional positional argument if there is no validation function for the optional argument.
3): In the case you have a validation function for the optional argument, if the input value pass the validation check, it will be considered as an optional argument. If the input value does not pass the validation check, it will be considered as a name-value parameter, as in case 2.

Catégories

En savoir plus sur Argument Definitions dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by