大家好,
我遇到了一些困难,即在一个 Expr1() 中正常评估的变量在调用第一个 Expr 的另一个 Expr2() 中无法正确评估。 我有一些代码,其中定义了一个 Expr1() 来生成感兴趣的列的分布。 稍后我还有另一个表达式 Expr2() 会回调 Expr1()。 Expr1() 中的某些变量在 Expr2() 中似乎无法正确计算。
对于视觉效果,Expr2() 生成一个如下所示的窗口:

第一个表达式 Expr1() 是在图形生成器下面生成包含的分发平台的表达式。 分布下方的组合框和按钮框允许用户在不同的拟合统计数据之间切换,例如不同的 R^2、RMSE、平均 Abs Dev、-Logliklihood 等。我的目的是相应地更新 GB 和分布。 GB 会适当更新,但发行版不会。 例如,将拟合统计量更改为 RMSE 时,结果如下:

它确实更新了分布图,但它使用它们的默认大小设置,而不是我在 Expr1() 中建立的大小设置。它应该看起来像这样,其中分布图的大小与第一张图片中的大小相同:

Expr1() 中生成分布的代码部分如下:
//this part gets column names to insert into Dispatch() below<BR />sfitcol1 = Column( NNYCol + NNcolshift ) << Get Name;
sfitcol2 = Column( NNYCol + 1 + NNcolshift ) << Get Name;
sfitcol3 = Column( NNYCol + 2 + NNcolshift ) << Get Name;<BR /><BR />//in this example, the results are:<BR />//"RMSE Training"<BR />//"RMSE Validation"<BR />//"RMSE Test"
<BR />//this part generates the Distributions that will be used to change my output report in Expr2()
dt_results << Distribution(
Continuous Distribution( Column( Eval( NNYCol + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 1 + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 2 + NNcolshift ) ), Quantiles( 0 ) ),
SendToReport(
Dispatch( {sfitcol1}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol1}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} )
)
);如果我自己运行 Expr1() ,它工作得很好,问题是当 Expr2() 调用 Expr1() 时它失败,因为它没有评估 Dispatch 中的变量 sfitcol# ,所以它没有改变 FrameBox 大小正如代码中应该的那样。
Expr2() 中交换分布的代码部分(仅使用组合框)如下:
NNycb = Combo Box(
NNylist,
<<SET></SET>
将 Expr1() 的部分放入组合框函数中,然后尝试运行 sfitcol 变量,然后发送到报告以修改框架框,会在嵌入式日志中出现以下错误:
在大纲上下文 {sfitcol1} 中找不到项目“sfitcol1”
在大纲上下文 {sfitcol1} 中找不到项目“sfitcol1”
在大纲上下文 {sfitcol2} 中找不到项目“sfitcol2”
在大纲上下文 {sfitcol2} 中找不到项目“sfitcol2”
在大纲上下文 {sfitcol3} 中找不到项目“sfitcol3”
在大纲上下文 {sfitcol3} 中找不到项目“sfitcol3”
如果我然后手动输入列名称,例如第一个 Dispatch: Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)}),那么它将更改相应的框架框。

因此,这是可能的,并且应该完成我在 Expr1() 中定义事物的方式,但是在 Expr2() 中执行事物时传递变量而不是变量的值(文本)。 希望得到一些关于如何纠正这个问题的建议。 我认为我不需要使用 Eval(Substitute(Expr())) 类型的解决方案,但也许我需要。
非常感谢任何想法/想法/建议。
谢谢!,
DS
我会避免在创建发行版时设置框架大小,并在创建发行版后更改它们。 当您将特定框架框设置为特定尺寸时,使用 XPath 获取引用然后更改尺寸应该相当容易。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Continuous Distribution(Column(:height), Quantiles(0)),
Continuous Distribution(Column(:weight), Quantiles(0))
);
wait(1); // demo purposes
rep = Report(dist);
(rep << XPath("//FrameBox[@helpKey='Distrib Histogram']")) << Frame Size(60, 100);
(rep << XPath("//FrameBox[@helpKey='Distrib Outlier Box']")) << Frame Size(30, 100);
wait(0);
dist << get xml;
关于您面临的问题,我必须编写测试脚本才能确定,但我的猜测是您应该在那里评估这些值。
你好@jthi ,
再次感谢您对我的问题的快速回复和解决。 XPath 命令真的很酷,只需阅读它的简短脚本索引条目就可以看出,我需要阅读有关 XPath 的更多信息以及如何充分利用它。 顺便说一句,脚本俱乐部已经讨论过这个问题了吗? 如果没有的话,这可能是一个好话题。
不管怎样,我修改了你的代码以更接近我手头的情况,并且它工作得很好。 看下面的修改版本,其中Expr2调用Expr1,然后Expr2里面,是对配线架大小的改变。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Expr1 = Expr(
dist = dt << Distribution(
Continuous Distribution( Column( :height ), Quantiles( 0 ) ),
Continuous Distribution( Column( :weight ), Quantiles( 0 ) )
)
);
Expr2 = Expr(
Nwin = New Window( "Dists", Outline Box( "Results", Expr1 ) );
Wait( 1 ); // demo purposes
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
);
Expr2;
对于可能不知道这一点的人来说,需要注意的一件事是,您不能在 New Window() 对象中包含代码的 XPath 部分。
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
这部分代码必须位于新窗口之外。 在我的特定情况下,我发现当按下组合框或上一个/下一个按钮时,我需要将其作为函数的一部分包含在内,否则会将分布的大小调整为其原始大小。 例如,对于组合框选项,它看起来像:
NNycb = Combo Box(
NNylist,
<<SET></SET>
当第一次预置到窗口时,有一个短暂的时刻,分布会调整为其默认大小,但随后它们会很快正确地调整大小。
再次感谢您的帮助,我一直很高兴在 JMP 讨论论坛中学习新东西。
谢谢!,
DS
我想我在第 7 节(报告层)上很快就介绍了 XPath,但我认为访问和遍历报告层对于其他较长的会议来说是一个很好的主题。 Xpath 基本上是它自己的语言,也是从 JSL 直接转换为其他编程语言的技能之一(正则表达式是另一个例子) XPath 教程 (w3schools.com) 。 当使用 << XPath 访问 JMP 中的报表层时,您可以轻松获得列表参考文献,您可以向列表发送消息,这使得它非常有用。 当您将 << Get XML 与 << XPath 组合时,您可以构建到不同显示框的健壮“路径”(基本上是获取引用)。