JSL - 使用列表填充時缺少列的最後一個值你好
當我運行公式以將列中列表中的一個元素分配給另一列中顯示另一個列表的元素的行時,我遇到了一個意外問題:我缺少最後一行的值。
ID_List = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"};
Vessel_List = {"CS1-1", "CS1-2", "CS1-3", "CS1-4", "CS1-5", "CS1-6", "CS1-7", "CS1-8", "CS1-9", "CS1-10", "CS1-11", "CS1-12", "CS2-1", "CS2-2", "CS2-3", "CS2-4", "CS2-5", "CS2-6", "CS2-7", "CS2-8", "CS2-9", "CS2-10", "CS2-11", "CS2-12", "CS3-1", "CS3-2", "CS3-3", "CS3-4", "CS3-5", "CS3-6", "CS3-7", "CS3-8", "CS3-9", "CS3-10", "CS3-11", "CS3-12", "CS4-1", "CS4-2", "CS4-3", "CS4-4", "CS4-5", "CS4-6", "CS4-7", "CS4-8", "CS4-9", "CS4-10", "CS4-11", "CS4-12"};
dt << New Column( "Vessel NB",
"Numeric",
"Continuous",
Formula(
For( i = 1, i < N+1, i++,
r= dt<<GETROWSWHERE></GETROWSWHERE>這是它的樣子

我在進行相同練習的多個領域都遇到了這個問題。
我通過採用先前的值找到了解決方法(我知道該值與我對錶進行排序的值相同)。
// change data type of Vessel Nb to numeric continuous
Column("Vessel NB") << delete formula;
Column("Vessel NB") << unlock;
Column("Vessel NB")<< data type(numeric)<<FORMAT></FORMAT>但是,雖然此解決方法適用於我的第一個表,但在處理第二個表時,我收到以下消息並且無法解決問題。

我不明白為什麼我收到此消息,而我顯然剛剛創建了一個包含公式並顯示為鎖定的列。
您對如何解決這個問題以及為什麼會出現這種情況有什麼建議嗎?
先感謝您
問候
注意:我正在使用 JMP 16
數據混合和清理質量和工藝工程回复:JSL - 使用列表填充時缺少列的最後一個值我之前的帖子裡有一個錯字。嘗試下面的 JSL,看看是否得到與以下相同的結果@喬治
Names Default To Here( 1 );
dt=current data table();
dt << New Column( "Vessel NB 3",
"Numeric",
"Continuous",
Formula(
currVessel = :Vessel ID ViCell;
r = Current Data Table() << Get Rows Where( :Vessel ID ViCell == currVessel );
try(r[n items(r)]);
)
);
回复:JSL - 使用列表填充時缺少列的最後一個值你好吉姆,
我想做的是將船舶 ID“翻譯”為船舶編號。 有超過 48 行,所以我認為你的解決方案沒有幫助。
不管怎樣,謝謝你
問候
席琳
回复:JSL - 使用列表填充時缺少列的最後一個值謝謝格奧爾格! 這就像一個魅力!
回复:JSL - 使用列表填充時缺少列的最後一個值我猜測了一點,但我相信您正在做很多不需要得到最終答案的工作。此外,您在格式中使用的值並非該格式本身的值。也就是說,如果您在運行格式後保存數據表、退出 JMP 會話、啟動新的 JMP 會話並打開保存的數據表,則公式將出錯。“n”、“Vessel_List”和“ID_Vessel”變量將不再在新 JMP 會話中定義。因此,該格式將不再運行。
下面的公式能達到你想要的效果嗎?
dt << New Column( "Vessel NB",
"Numeric",
"Continuous",
Formula(
currVessel = :Vessel ID ViCell;
r = Current Data Table() << Get Rows Where( :Vessel ID ViCell == curVessel );
r[n items(r)];
)
);
回复:JSL - 使用列表填充時缺少列的最後一個值你好,
我真的會避免這樣的構造。 看看該表中的公式就可以發現有問題。 您遇到了範圍界定問題(使用公式中外部定義的列表),並且嘗試將列本身寫入列中的公式內。 不知道 JMP 會讓我們...
不過我可以重現你的問題,但不能準確解釋原因。
所以我的建議是像下面的腳本所示那樣在外部循環,它更加透明。
loc() 函數給出列表中的位置(索引)。
另一種方法是從 ID_LIST 和 Vessel_LIST 生成一個表,
並將該表與引用 dt 的表連接起來。
Names Default To Here( 1 );
ID_List = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"};
Vessel_List = {"CS1-1", "CS1-2", "CS1-3", "CS1-4", "CS1-5", "CS1-6", "CS1-7", "CS1-8", "CS1-9", "CS1-10", "CS1-11", "CS1-12", "CS2-1", "CS2-2",
"CS2-3", "CS2-4", "CS2-5", "CS2-6", "CS2-7", "CS2-8", "CS2-9", "CS2-10", "CS2-11", "CS2-12", "CS3-1", "CS3-2", "CS3-3", "CS3-4", "CS3-5", "CS3-6",
"CS3-7", "CS3-8", "CS3-9", "CS3-10", "CS3-11", "CS3-12", "CS4-1", "CS4-2", "CS4-3", "CS4-4", "CS4-5", "CS4-6", "CS4-7", "CS4-8", "CS4-9", "CS4-10",
"CS4-11", "CS4-12"};
Show( N Items( ID_LIST ) );
Show( N Items( Vessel_LIST ) );
dt = New Table( "test", add rows( 48 ), New Column( "Vessel ID ViCell", Character, Nominal, set values( Vessel_list ) ) );
N = N Rows( dt );
dt << New Column( "row", "Numeric", "Continuous", Formula( For( i = 1, i <= N, i++, Column( dt, "row" )[i] = i ) ) );
dt << New Column( "Vessel NB",
"Numeric",
"Continuous",
Formula(
For( i = 1, i < N + 1, i++,
r = dt << getRowsWhere( :Vessel ID ViCell == Vessel_List[i] );
Column( dt, "Vessel NB" )[r] = ID_List[i];
)
)
);
// My proposal: run the loop outside, as the lists are outside, too
dt << New Column( "Vessel NB 2", "Numeric", "Continuous" );
For Each Row( dt, :Vessel NB 2 = ID_LIST[Loc( Vessel_LIST, :Vessel ID ViCell )[1]] );