使用 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 );