循环问题我遇到了这个无法解决的重复循环检测问题,希望有人能帮助我。
请参阅附件中的示例脚本。它会生成一个表格。这里的想法是,我想将第 1 列中每次连续运行的 1 标记为带有连续编号的事件。
公式有效。但是,当我对表格进行任何修改或重新运行公式时,我会收到一个、两个或有时三个循环检测错误。这只是一个示例表。在我的实际数据表中,如果我更改列公式或在表格上进行其他编辑,有时我不得不点击“忽略所有循环”多达十几次。
有人知道这是什么原因造成的吗?
谢谢
New Table( "Cycle Problem",
Add Rows( 21 ),
New Table Variable( "P1", 3 ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0]
)
),
New Column( "Column 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If(
Row() == 1, :P1 = 0,
:Column 1 == 1 & :Column 1[Row() - 1] == 0, :P1 = :P1 + 1,
:Column 1 == 1, :P1
)
),
Set Selected
)
)
自动化和脚本回复:循环问题不确定循环警告是什么意思。在我看来,这似乎是虚惊一场。但与此同时,我猜想以下脚本的结果正是您要实现的,并且不存在循环问题。
New Table( "Cycle Problem",
Add Rows( 21 ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0]
)
),
New Column( "Column 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If(
Row() == 1, 0,
:Column 1 == 1 & :Column 1[Row() - 1] == 0, :Column 2[Row() - 1] + 1,
:Column 2[Row() - 1]
)
),
Set Selected
)
)
回复:循环问题最有可能的循环问题是由您设置:P1 表变量值并在同一公式中比较它们引起的
If(Row() == 1,
:P1 = 0
, :Column 1 == 1 & :Column 1[Row() - 1] == 0,
:P1 = :P1 + 1
, :Column 1 == 1,
:P1
)
您可以使用类似公式
If(Row() == 1,
retval = 0
, :Column 1 == 1 & Lag(:Column 1) == 0,
retval = retval + 1
);
retval;

Lag()可让您访问列中的早期值
回复:循环问题你好,
您也可以滞后公式列本身。也就是说,您可以在 C2 列中对 C1 中的值使用此公式:
If( Row() == 1,
0,
Lag( :C2 ) + (Lag( :C1 ) == 0 & :C1 == 1)
)
回复:循环问题@peng_liu 、 @jthi和@brady_brady ...
感谢您在这方面的帮助。但是,您提供的脚本并没有完全满足我的需要,当我尝试修改它们时,它们不起作用。具体来说,只有当第 1 列中有 1 时,第 2 列中的编号才会出现。如果第 1 列中有 0,则第 2 列为空白。像这样...

当我尝试添加额外的 IF 语句来实现此目的时,脚本失败。
例如,这是我使用@peng_liu脚本所做的。
New Table( "Cycle Problem",
Add Rows( 21 ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0]
)
),
New Column( "Column 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If(
Row() == 1, 0,
:Column 1 == 1 & :Column 1[Row() - 1] == 0,
:Column 2[Row() - 1] + 1,
:Column 1 == 1, :Column 2[Row() - 1]
)
),
Set Selected
)
)
我还注意到另一个可能相关的问题。当我运行我提供的原始脚本时,第 2 列是空白的。但是,如果我使用任何类型的随机公式添加第 3 列,值就会突然出现在第 2 列中。我的其他一些表格也出现了这种情况。
@brady_brady我仍在研究您的解决方案,看看是否可以使其发挥作用。
与此同时,您是否还能提供任何进一步的指导来帮助我?
非常感谢您所有的帮助。
回复:循环问题例如,您可以在末尾添加一个 If 语句
Names Default To Here(1);
dt = New Table("Cycle Problem",
Add Rows(21),
New Column("Column 1",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0])
)
);
dt << new column("C", Numeric, Ordinal, Formula(
If(Row() == 1,
retval = 0;
, :Column 1 == 1 & Lag(:Column 1) == 0,
retval = retval + 1
);
If(:Column 1 == 1,
retval;
,
.
);
));

回复:循环问题这似乎可行,但是很麻烦。
If( Row() == 1,
0,
If( :C1 == 1,
If( Lag( :C1 ) == 0,
Max( :C2[Index( 1, Row() - 1 )] ) + 1,
Lag( :C2 )
),
.
)
)
另一个选项是针对“C3”列的公式:
If(
Row() == 1,
c = 0;
c;
,
:C1 == 0,
.
,
Lag( :C1 ) == 1,
Lag( :c3 )
,
c++;
c;
)
回复:循环问题@jthi !这似乎有效。虽然我不确定我是否理解为什么它适用于单独的 IF 语句,而不适用于组合 IF 语句,如我的@peng_liu修改中所示。
但更重要的是,为什么创建表变量会导致问题,而在脚本内创建变量却不会?
回复:循环问题Col Cumulative Sum() 也可用于此
Names Default To Here(1);
dt = New Table("Cycle Problem",
Add Rows(21),
New Column("Column 1",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0])
)
);
dt << new column("C", Numeric, Ordinal, Formula(
If(:Column 1,
Col Cumulative Sum(Dif(:Column 1) == 1)
,
.
);
));回复:循环问题这真是太棒了。
回复:循环问题@peng_liu 、 @jthi和@brady_brady感谢大家提供的解决方案。我特别喜欢@jthi的解决方案。我从来不知道 Col Cumulative Sum 可以这样使用。非常简单、高效、优雅。
我仍在努力理解变量在 JMP 中的工作原理。我不太确定自己是否已经完全理解,但我正在努力。
回复:循环问题可以,但我不能 100% 确定您是否应该这样做,即使这是 JMP 公式的更好功能之一(JMP 支持告诉我这是非预期行为)。这里有一个愿望清单项目,希望 JMP 能够承认这绝对是需要的行为,使在“设置每个值”中使用公式表达式并在 Col 统计公式中使用表达式作为第一个参数支持行为。
对于循环问题及其解释,您可以联系 JMP 支持。我只能提供猜测(可能正确或完全错误),因为我不是 JMP 开发人员,但我可以理解它,因为它试图同时获得多个值。这也可能是一篇不错的读物我对变量感到困惑