我有一個循環公式。JMP 可以解決這個問題,但每次我創建新公式時它都會發出有關循環的警告。
我怎麼能夠:
- 強制進行新的迭代?
- 配置迭代次數(或停止標準)來解決遞歸問題?
- 阻止評估再次發生? 抑制公式菜單中的 Eval 選項不起作用。
該函數稍微複雜一點,但與下面的沒有什麼不同,它的工作沒有抱怨。
X (k+1) = 0.99 * X(k)
If(
Selected() == 1, 1,
Row() == 1, 1,
Lag( :X ) * 0.99
)
您提供的功能應該按原樣運行,沒有任何警告。如果您實際上在 B 的公式中引用 A 列,在 A 的公式中引用 B 列,那麼您可以嘗試將該邏輯編寫為單個公式或遵循@Craige_Hales的建議並使用腳本來完成此操作。
包含示例公式的表格,其計算結果應該不會出現警告或錯誤。
New Table( "Untitled 16",
Add Rows( 10 ),
New Column( "X",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( Selected() == 1, 1, Row() == 1, 1, Lag( :X ) * 0.99 ) ),
Set Selected
),
Set Row States( [0, 0, 0, 0, 1, 0, 0, 0, 1, 0] )
)
JMP 的公式計算器的工作方式是,首先評估僅依賴於非公式列的公式列,然後評估依賴於已評估的公式列的公式列。 如果 A 列的公式取決於 B 列,而 B 列的公式又取決於 A 列,則 JMP 無法選擇首先計算哪一個。 如果您設法欺騙 JMP 創建循環依賴關係,您將無法確定哪一列正在使用另一列的舊數據。
JMP 從上到下評估列。 在公式中,您可以使用滯後函數(或子腳本)來查看較早的行並獲取先前計算的值。 我不確定如果您查看未來的行會發生什麼,但該值尚未計算。
您可能認為有些公式可以基於 Excel 規則起作用,但是JMP 不是電子表格並按上述規則進行遊戲。 如果需要使 A 列引用 B 列的滯後,B 列引用 A 列的滯後,則應將 A 和 B 設為非公式列,並編寫 JSL 來填充它們。 將該 JSL 添加到名稱類似於“Run Me When The Data Needs To Be Updated”的表腳本中。
如果您有遞歸函數,則可以創建一個調用自身的 JSL 函數。 JSL 對允許的遞歸深度有相當低的限制,100 左右。 您必須編寫自己的 if 語句來決定何時停止遞歸。 通常,深度參數用於停止遞歸,例如(未經測試,毫無意義......)
f = function({depth}, if(depth < 10, /* do something */ f(depth + 1) ) );
f(0)