如何让脚本为输入提示赋值?

时间:2016-09-02 11:45:06

标签: matlab

我有一些较小的脚本function clickF1() { var dec12 = document.getElementById("dec12"); var nov13 = document.getElementById("nov13"); var dec15 = document.getElementById("dec15"); if ("dec12") { document.getElementById("output1").innerHTML = "Correct!"; } else if ("nov13") { document.getElementById("output1").innerHTML = "Way off!"; } else if ("dec15") { document.getElementById("output1").innerHTML = "Close but nope!"; } } foo1等的集合以及一个运行它们的脚本foo2,如下所示:

master.m

让我们说% master.m run foo1 run foo2 通过说foo1来调用输入。

我认为如果我在a = input('Gimme a number\n');命令之后将我想要的值放在新行上,它们将作为输入输入,但它们不会。我也尝试将它们作为字符串括起来,即run。这也不起作用。

我应该使用他们的另一个功能吗?我查看了'5'的帮助文件,但没有input函数。据推测,某处有outputwrite

如何在不触摸键盘的情况下将用户输入提供给另一个脚本调用的脚本?我可以将我想要输入的值放在writetostdio文件中吗?

编辑: 因为有些混乱,我会尽力清理它。

脚本master.mfoo1不会来回传递值。每个脚本都将foo2独立。相反,我正在尝试针对一系列用户行为测试程序(这是对runinput提示的响应。这些通常在键盘上输入,但我希望我的foo1文件告诉master.m用户输入的是什么。

很抱歉,如果这令人困惑,但希望能够解决这个问题。

2 个答案:

答案 0 :(得分:3)

修改现有代码以适应手动输入和测试输入是微不足道的:

function foo1(niterations)
if nargin == 0
    niterations = round(input('How many iterations? '));
end

for ii = 1:numel(niterations)
    % Run the thing
    fprintf('Running some random program with %d iterations! Yay!\n', niterations(ii));
end

end

使用这种方法我们可以做到:

>> foo1
How many iterations? 2
Running some random program with 2 iterations! Yay!

>> foo1(2)
Running some random program with 2 iterations! Yay!

>> foo1([1, 3, 5, 7, 9])
Running some random program with 1 iterations! Yay!
Running some random program with 3 iterations! Yay!
Running some random program with 5 iterations! Yay!
Running some random program with 7 iterations! Yay!
Running some random program with 9 iterations! Yay!

这比尝试从文本文件中输入内容,使用evalin将内容放入工作空间,或者以这种方式使用脚本所需的任何自动方法更为合乎逻辑。

答案 1 :(得分:0)

好的,这有点难看......但如果由于某些原因foo1.m等必须保留为脚本,可能会解决这个问题。

我们的想法是用新定义的函数input替换myInput的每个实例,该函数检查是否已在基础工作空间中设置变量PROMPT_VALUE;如果是,则返回,否则传递给内置input。例如:

% myInput.m
function [ valueOut ] = myInput( promptString )

    W = evalin('caller','whos'); %or 'base'
    doesPVexist = ismember('PROMPT_VALUE',[W(:).name]);

    if doesPVexist
        valueOut = evalin('caller', 'PROMPT_VALUE');
    else
        valueOut = input(promptString);
    end

end

假设我们有以下子脚本:

% foo1.m
a = myInput('Number to double: ');
disp(2*a);

% foo2.m
b = myInput('Number to halve: ');
disp(b/2);

我们可以按如下方式测试该方法:

% master.m
clearvars;
PROMPT_VALUE=5;
run foo1.m;

PROMPT_VALUE=3;
run foo2.m

如果你按原样运行它,它将把PROMPT_VALUE作为每个下标的输入(返回10和1.5)。如果这些行被注释掉,它将寻找用户的输入。