For 循环未按预期工作你好,
我有两个非常令人困惑的问题。
1 ) 对于下面的简单 for 循环,我有 3 个满足单个输出的条件。我通过手动查看和绘图验证了所有 8 种组合确实存在于数据中。然而,这却是不平衡的,只有 x1、x2 和 x3 会填充到 X1 列中的所有单元格中。例如,条目 x2 将分配给它双倍的条目数。通过子集进一步检查,x2 和 x4 确实满足 A1、B1 和 C1 列,这将是同等份额。所有列共享相同的数据和建模类型。
我还屏蔽了收集双倍条目的条目,只是为了看看会发生什么。例如,然后将条目捆绑为 x2。
For( i = 1, i <= N Rows ( dt ), i++,
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1";
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2";
);
);
2) 如果我通过使用 & 为单元格赋值来缩短代码,则会收到错误“尝试分配给不是 L 值的对象”。这是尝试缩短我的代码并且不具有多个不同的循环。下面是 3 个标准和 3 个输出的示例。
For( i = 1, i <= N Rows ( dt ), i++,
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2";
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y2" & :Z1[i] = "z1";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y4" & :Z1[i] = "z4";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y1" & :Z1[i] = "z1";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y2" & :Z1[i] = "z4";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y4" & :Z1[i] = "z2";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3";
);
);
任何指导将不胜感激。感谢您的提前帮助!
质量和工艺工程回复:For循环没有按预期工作我还确保在代码中正确调用了列名,并且在行尾尝试了逗号和分号。 我已将代码分成更小的块,将 A1 列中的可能值分成不同的 for 循环,但我有同样的问题。
回复:For循环没有按预期工作你好@StarfruitBob ,
你很近...
的语法如果函数是如果(条件 1,结果 1,条件 2,结果 2,否则结果)。
因此,通过用逗号替换结尾的分号来修改您的语句:
For( i = 1, i <= N Rows ( dt ), i++,
If(
// condition 1 = :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1"
// result 1 = :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2"
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2"
,
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3"
,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y2" & :Z1[i] = "z1"
,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y4" & :Z1[i] = "z4"
,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y1" & :Z1[i] = "z1"
,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y2" & :Z1[i] = "z4"
,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y4" & :Z1[i] = "z2"
,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3"
);
);
HTH。
干杯,
斯坦
回复:For循环没有按预期工作你好,斯坦,
感谢您的快速回复!这是我已经试验过的东西,例如,将填充 x1、x2 和 x3,而不是填充 x1、x2 和 x4。
这也发生在多个输出上,例如 X1 和 Y1 列。
回复:For循环没有按预期工作是的,请确保您使用 Stan 建议的逗号。 如果秘密
编辑:我想你想要
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1" , :X1[i] = "x1" ,
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2" , :X1[i] = "x2" ,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1" , :X1[i] = "x3" ,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2" , :X1[i] = "x4" ,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1" , :X1[i] = "x3" ,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2" , :X1[i] = "x4" ,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1" , :X1[i] = "x1" ,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2" , :X1[i] = "x2" ,
throw("Nothing matched!") // this is the otherwise case
);
如果您真的想要多个作业,请使用 ;而不是 &
:X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2" // change this
:X1[i] = "x1"; :Y1[i] = "y1"; :Z1[i] = "z2"; // to this
虽然它可能与 & 一起工作,但它非常脆弱,下一个人很难解开谜题。 正如你所说,编译器看到
a=1 & b=2
作为
a = ( ( 1 & b ) = 2 )
产生 L 值消息。 如果错误消息不是程序员所代表的,那就太好了我无法将 = 右侧的值 2 存储到 = 左侧的“1 & b”中,因为“1 & b”不是变量名.
实际上,编译器在 a=1 & b=2 上做得相当不错:
试图在访问或评估 'Assign' 时分配给不是 L 值的对象,1 & b = /*###*/2 /*###*/
回复:For循环没有按预期工作这实际上是我在这一切中的第二次尝试,周末我又回来了,它奏效了。我没有解释为什么我第一次像这样尝试它时它不起作用。谢谢您的答复!