我想在没有创建新桌子的情况下旅行。 MATLAB有一个rowfun API。但它不喜欢没有返回类型的lambda。还有更好的事情吗?
>> T = table({1;2;3})
T =
Var1
____
[1]
[2]
[3]
>> rowfun(@(x) display('') , T)
Error using table/rowfun>dfltErrHandler (line 338)
Applying the function '@(x)display('')' to the 1st row of A generated the following error:
Too many output arguments.
Error in table/rowfun>@(s,varargin)dfltErrHandler(grouped,funName,s,varargin{:}) (line 200)
errHandler = @(s,varargin) dfltErrHandler(grouped,funName,s,varargin{:});
Error in table/rowfun (line 219)
[b_data{i,:}] = errHandler(struct('identifier',ME.identifier, 'message',ME.message,
'index',i),inArgs{:});
>> rowfun(@(x) x , T)
ans =
Var1
____
[1]
[2]
[3]
答案 0 :(得分:3)
如果您不希望显式输出,请使用以下语法来调用rowfun
:
rowfun(@(x) display(''), T, 'NumOutputs', 0)
给出以下示例:
T = table({1;2;3});
fprintf('rowfun:\n')
rowfun(@(x) display(''), T, 'NumOutputs', 0, 'OutputFormat', 'uniform');
fprintf('arrayfun:\n')
arrayfun(@(x) display(''), table2array(T))
我们获得了一致的回报:
>> testcode
rowfun:
''
''
''
arrayfun:
''
''
''
错误基于rowfun
期望必须以某种格式(表格,单元格等)提供输出,因此它的默认值是期望来自函数的至少一个输出参数处理它& #39;正在使用。
您可以在rowfun
的来源(open rowfun
)中找到相关部分:
pnames = {'GroupingVariables' 'InputVariables' 'OutputFormat' 'NumOutputs' 'OutputVariableNames' 'SeparateInputs' 'ExtractCellContents' 'ErrorHandler'};
dflts = { [] [] 2 1 {} true false [] };
[groupVars,dataVars,outputFormat,nout,outNames,separateArgs,extractCells,errHandler,supplied] ...
= matlab.internal.table.parseArgs(pnames, dflts, varargin{:});
和
try
if nout > 0
[b_data{i,:}] = fun(inArgs{:});
else
fun(inArgs{:});
end
catch ME
if nout > 0
[b_data{i,:}] = errHandler(struct('identifier',ME.identifier, 'message',ME.message, 'index',i),inArgs{:});
else
errHandler(struct('identifier',ME.identifier, 'message',ME.message, 'index',i),inArgs{:});
end
end
正如您所看到的,默认输出数量为1
,除非您使用明确的rowfun
NV对调用'NumOutputs', 0
,否则它会产生输出来自display
,这显然会导致错误。