使用 Replace into 将多个命令解析为 expr我试图根据函数中给出的参数将任意数量的参考线添加到图中。我可以毫不费力地构建我需要的字符串。我遇到的问题是,由于字符串中的逗号,我似乎无法将其放入过去的 parse() 中。我真正想做的就是从字符串中去掉外引号并将其替换为并在必要时删除 \!。也许有更好的方法来做到这一点,但这是我尝试的核心:
需要调整的表达式:
FixyAxis = expr( gbt <<
SendToReport(
Dispatch(
{},
"Graph Builder",
OutlineBox,
{myTitle}
),
Dispatch(
{},
name,
ScaleBox,
{
Min( minY ), Max( maxY ), Inc( ticksY ),
IntRefLines,
Show Major Grid( 1 ), , Show Minor Grid( 1 )
}
)
)
) ;
我试图用字符串变量替换(为了可读性添加了 cr):
myRefLines = "Add Ref Line(60, Solid, \!"Medium Dark Red\!",\!"USL_lt_2.5\!", 2 ),
Add Ref Line(30, Solid, \!"Medium Dark Red\!",\!"USL_gt_2.5_lt_4.5\!", 2 ),"
但是 parse() 遇到第一个逗号并退出:
substitute into(fixYaxis, Expr(IntRefLines), parse(myRefLines)) ;
意想不到的“,”。 可能少了一个“;”或者 ”,”。
第 1 行第 60 列:...rk Red","USL_lt_2.5", 2 )►,添加参考线(30, Solid, ...
最后我想要的 fixYaxis 看起来像这样:
FixyAxis = expr( gbt <<
SendToReport(
Dispatch(
{},
"Graph Builder",
OutlineBox,
{myTitle}
),
Dispatch(
{},
//"Mean",
name,
ScaleBox,
{
Min( minY ), Max( maxY ), Inc( ticksY ),
Add Ref Line(60, Solid, "Medium Dark Red","USL_lt_2.5", 2 ),
Add Ref Line(30, Solid, "Medium Dark Red","USL_gt_2.5_lt_4.5", 2 ),
Show Major Grid( 1 ), , Show Minor Grid( 1 )
}
)
)
) ;
谢谢你的帮助!
菲尔
回复:使用 Replace into 将多个命令解析为 expr谢谢!
我也尝试过克拉替代的想法。我之前看到过这个方法,但没理解。您的代码非常有帮助,可以直接实现我的原始代码(复制、剪切、粘贴和工作!)。“\[”是我不知道的东西,我还有另一个问题可以使用这个 evalinsert 解决方案。
对于我的回复被添加到线程中的方式,我向所有人表示歉意。我的目的是在每个代码发布者的回复之后解决他们的回复,但我不断看到它们有些随机添加。 带有图表图片的回复旨在作为对第二个代码示例的注释。这篇文章适用于第三个代码示例,其他内容均与第一个代码示例相关。
回复:使用 Replace into 将多个命令解析为 expr谢谢!
我首先实施了这个想法,因为它最初对我来说最有意义。我选择了第二个海报代码而不是你的,因为它更适合我未来的需求。不过,我从你的方法中学到了一些东西,我将把它们用于解决我遇到的另一个问题。
回复:使用 Replace into 将多个命令解析为 expr谢谢!
我尝试过这样的想法,但真的不明白如何将消息字符串组合到图表中。我修改了您的脚本以使用 parse(refLinesList[i]) 因为我的列表项比您的示例更复杂。因为我打算更改脚本以接受限制列表,而不是从此解决方案构建最能满足我当前需求的解决方案。
这也是构建通用图形函数的更大函数的一部分(仍在进行中)。完成的图表如下所示:

回复:使用 Replace into 将多个命令解析为 expr特克斯尼尔森,
我实现了你的方法,但需要进行一些修改。 据我了解,它基本上是一个字符串结构,然后被解包/解包。 但为了让它工作,我从“myExpr = Expr(TheExpr ="FixyAxis = Expr(”)中删除了“FixyAxis =”,然后将其分配给解析命令的输出。 然后为了让它工作,我必须 eval(FixyAxis)。 所以这个“myexpr;Parse( theexpr );”变成“myexpr; FixyAxis = Parse(theexpr) ;Eval(fixYaxis) ;”。 但 eval(parse(theexpr)) 没有。
谢谢!
回复:使用 Replace into 将多个命令解析为 expr启动平台并随后发送一系列消息来添加行而不是尝试构建复杂的启动消息会更简单吗?
回复:使用 Replace into 将多个命令解析为 expr你好,
感谢您的回复。 我现在正在尝试这个,它似乎按照我想要的方式工作,尽管我必须修改其他代码才能使其工作 - JMP 的语法要求似乎随着更多“添加参考线”而改变 - 我没有注意到直到我手动构建另一个图表并转储脚本。
当我完成后,我会更新讨论。
感谢您的帮助!
菲尔
回复:使用 Replace into 将多个命令解析为 expr这是动态构建字符串然后使用 eval(parse()) 执行最终结果的另一种方法。 使用 evalinsert 替换插入符号包围的变量(即 ^varname^)。 还使用字符串转义字符 \[ 和 ]\ 以避免必须转义字符串内的双引号。
myRefLines = "\[Add Ref Line(60, Solid, "Medium Dark Red","USL_lt_2.5", 2 ),
Add Ref Line(30, Solid, "Medium Dark Red","USL_gt_2.5_lt_4.5", 2 ),]\";
FixyAxis = evalinsert("\[
gbt << SendToReport(
Dispatch( {}, "Graph Builder", OutlineBox, {myTitle}
),
Dispatch( {}, name, ScaleBox,
{
Min( minY ), Max( maxY ), Inc( ticksY ),
^myRefLines^,
Show Major Grid( 1 ), , Show Minor Grid( 1 )
}
)
)
)]\");
eval(parse(fixyaxis));回复:使用 Replace into 将多个命令解析为 exprFWIW,这是您可能可以建立的替代方案:
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size( 528, 452 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 8 ) ), Smoother( X, Y, Legend( 9 ) ) ),
);
// Make some reference lines
n = 3;
refLineList = {};
for(i=1, i<=n, i++,
InsertInto(refLineList, EvalExpr(Add Ref Line( Expr(RandomInteger(55,65)), "Solid", "Medium Dark Green")));
);
// Add the reference lines
for(i=1, i<=n, i++,
addLine = Expr(Report(gb)[axisBox(2)] << lineTBD);
SubstituteInto(addLine, Expr(lineTBD), refLineList[i]);
addLine;
);回复:使用 Replace into 将多个命令解析为 expr当“替代”失败时,我会转而生成我需要的代码
我不确定这是否正是您想要的,但它应该为您提供解决问题的潜在方法
Names Default To Here( 1 );
myExpr = Expr(
TheExpr =
"FixyAxis = Expr(
gbt << SendToReport(
Dispatch( {}, \!"Graph Builder\!", OutlineBox, {myTitle} ),
Dispatch(
{},
name,
ScaleBox,
{Min( minY ), Max( maxY ), Inc( ticksY ),"
|| myRefLines || ", Show Major Grid( 1 ), ,
Show Minor Grid( 1 )}
)
)
);"
);
myRefLines =
"Add Ref Line(60, Solid, \!"Medium Dark Red\!",\!"USL_lt_2.5\!", 2 ),
Add Ref Line(30, Solid, \!"Medium Dark Red\!",\!"USL_gt_2.5_lt_4.5\!", 2 )";
myexpr;
Parse( theexpr );