我试图让用户输入几个变量,一旦这些变量被认为是正确的,那么 ok 按钮就会从灰色变为活动状态。 我得到了这个工作。 我没有工作的是 Eval Expr(输出)。 这只是一件简单的事情,只是为了确保在我进行计算之前我有这个工作。 当我运行脚本时,这是一个屏幕截图,确定按钮是灰色的:

然后,我输入合理的值,单击验证输入后,确定按钮显示为活动状态:

但它没有运行我的表达式并创建表。 我究竟做错了什么? 我使用的是 JMP 16.0 Pro。 就像我说的,我做了一些非常简单的事情,比如创建一个表格,只是为了确保我的脚本在我深入了解我真正需要的东西之前可以正常工作。
Names Default To Here( 0 );
Clear Log();
w = New Window( "Variables",
<<MODAL>= 1 | alpha == 0,
alphaw = New Window( "Error!",
<<MODAL>= 1 | beta == 0,
betaw = New Window( "Error!",
<<MODAL> 90 | percent == 0,
percentw = New Window( "Error!",
<<MODAL> 0.90 | p0 == 0,
p0w = New Window( "Error!",
<<MODAL>= 1 | Abs( beta ) >= 1 | DOEN == 0 |
Abs( percent ) > 90 | percent == 0 | Abs( p0 ) > 0.90 | p0 ==
0 | alpha == 0 | beta == 0, bb << Enable( 0 ),
bb << Enable( 1 ),
Eval Expr( output )
);
)
),
bb = Button Box( "OK" ),
bb << Enable( 0 );
)
)
);
Show( alpha );
Show( beta );
Show( DOEN );
Show( percent );
Show( p0 );
output = Expr(
dt = New Table( "Test Table",
New Column( "a", Set Values( {alpha, beta, N, percent, p0} ) )
);
w << closeWindow;
);</MODAL></MODAL></MODAL></MODAL></MODAL>
我认为你应该能够摆脱 eval expr()。 如果你只是做输出,它会评估。 你也可以只做 Eval(output)。EvalExpr 更多用于创建动态表达式。这是脚本索引中的一点。
EvalExpr 返回表达式的副本,其中 x 中的每个 Expr() 子句都替换为其计算值
所以
Eval Expr( Length( Expr( "X" || Char( 12 ) ) ) ); // returns Length("X12")
如果你想评估它,你必须这样做
Eval(Eval Expr( Length( Expr( "X" || Char( 12 ) ) ) ));
但你只是想评估一个我认为的表达式,所以你可能不需要 evalexpr()
在创建 w 之前移动输出表达式,并在按下 OK 按钮时创建输出。
查看更多...Names Default To Here(0);
Clear Log();
output = Expr(
dt = New Table("Test Table", New Column("a", Set Values({alpha, beta, N, percent, p0})));
bb << click;
);
w = New Window("Variables",
<<MODAL>= 1 | alpha == 0,
alphaw = New Window("Error!",
<<MODAL>= 1 | beta == 0,
betaw = New Window("Error!",
<<MODAL> 90 | percent == 0,
percentw = New Window("Error!",
<<MODAL> 0.90 | p0 == 0,
p0w = New Window("Error!",
<<MODAL>= 1 | Abs(beta) >= 1 | DOEN == 0 | Abs(percent) > 90 | percent == 0 | Abs(p0) > 0.90 | p0 == 0 | alpha == 0 | beta == 0,
bb << Enable(0),
bb << Enable(1),
write(); //not sure why this is needed here
);
)
),
bb = Button Box("OK", output, << enable(0))
)
)
);
Show(alpha);
Show(beta);
Show(DOEN);
Show(percent);
Show(p0);</MODAL></MODAL></MODAL></MODAL></MODAL> 并且因为您使用的是 Modal,所以您也可以在关闭 modal 后创建新表,因为在关闭 modal 之前脚本不会继续执行。
这是一个示例,如果您愿意,您可以如何重构代码(您也可以使用 << 设置最小值和 << 设置最大值将最小值/最大值“强制”到数字编辑框)。 如果您愿意,这还允许您在验证步骤中显示所有错误消息:
查看更多...Names Default To Here(0);
Clear Log();
validator = function({alpha, beta, N, percent, p0}, {Default Local}, //could also be expression, but this way you avoid creating unnecessary variables
DOEN = 0;
For(i = 1, i < 10, i++,
If(2 ^ i == N,
DOEN = DOEN + 1
)
);
error_list = {};
If(Abs(alpha) >= 1 | alpha == 0,
Insert Into(error_list,"Alpha needs to be between 0 and 1, please fix and try again");
);
If(Abs(beta) >= 1 | beta == 0,
Insert Into(error_list,"Beta needs to be between 0 and 1, please fix and try again");
);
If(DOEN == 0,
Insert Into(error_list,"N should be 2\!U1D3A, do not include centerpoints or repeats with N, please fix and try again");
);
If(Abs(percent) > 90 | percent == 0,
Insert Into(error_list,"The percent needs to be between 0 and 90%, please fix and try again");
);
If(Abs(p0) > 0.90 | p0 == 0,
Insert Into(error_list,"The p0 needs to be between 0 and 0.90, please fix and try again");
);
If(N Items(error_list) > 0,
nw = New Window( "Error!", <<MODAL></MODAL>编辑:
显示框使用的一些选项:
查看更多...Names Default To Here(0);
Clear Log();
validator = function({alpha, beta, N, percent, p0}, {Default Local},
error_list = {};
DOEN = 0;
For(i = 1, i < 10, i++,
If(2 ^ i == N,
DOEN = DOEN + 1
)
);
If(Abs(alpha) >= 1 | alpha == 0,
Insert Into(error_list,"Alpha needs to be between 0 and 1, please fix and try again");
);
If(Abs(beta) >= 1 | beta == 0,
Insert Into(error_list,"Beta needs to be between 0 and 1, please fix and try again");
);
If(DOEN == 0,
Insert Into(error_list,"N should be 2\!U1D3A, do not include centerpoints or repeats with N, please fix and try again");
);
If(Abs(percent) > 90 | percent == 0,
Insert Into(error_list,"The percent needs to be between 0 and 90%, please fix and try again");
);
If(Abs(p0) > 0.90 | p0 == 0,
Insert Into(error_list,"The p0 needs to be between 0 and 0.90, please fix and try again");
);
If(N Items(error_list) > 0,
nw = New Window( "Error!", <<MODAL></MODAL>
我首先尝试了 Eval(输出),但没有成功,所以我第二次尝试了 Eval expr()。 我自己尝试了输出,但它不起作用。