我对变量感到困惑我在弄清楚局部变量如何工作时遇到了概念问题。我将简化问题,重点关注令我困惑的问题。
我创建一个局部变量,例如 t0,其值为 5。然后我编写一个列公式将该值增加 1...t0=t0+1 或 t0+=1(这似乎并不重要),我预期的结果是,当 JMP 评估列中的每个单元格时,它会递增变量,因此当我向下移动列时,我会得到 6、7、8 等。相反,我得到一列 6。所以公式并没有增加变量。
有人可以向我解释一下我对 JMP 如何处理局部变量的不理解之处吗?另外,由于我的方法不起作用,是否还有另一种方法来增加变量?我可以用 Lag 来做到这一点,但对于如此简单的事情来说,这似乎不必要地复杂。
另外,我不清楚局部变量、表变量和参数之间的区别。
预先感谢您提供的所有帮助。
自动化和脚本编写回复:我对变量感到困惑You might be interested in the Row() function inside of a column formula -- it returns the current row that the formula is being run against. As for variables and scoping -- it is usually best to be explicit about variable scopes. Thus to use a global counter, do ::t0 += 1 -- the double colon explicitly scopes the name to the global namespace. If you want a local name, explicitly scope it, i.e., local:t0 There is also the Here namespace, and again it is best to be explicit in scoping. I recommend being explicit as JMP is buggy and will not always adhere to the stated scoping rules.
回复:我对变量感到困惑我猜您写了类似以下内容的列公式:
Local({t0 = 5}, t0 = t0 + 1)
并且您期望初始分配
t0 = 5
仅当数据表从上到下逐个单元格评估列时发生一次。
你已经看到这并没有发生。您看到的是每次计算单元格时都会发生分配。如果您有 SAS 编程经验,您可能正在寻找类似于 SAS 中的 RETAIN 语句的内容。我不知道 JMP 的脚本语言中存在这样的东西。
但我也有类似的需要进行计算,需要检索以前计算中的结果。
如果结果是中间的和临时的,我会将结果存储在单独的列中。如果结果只是同一列中前一个单元格中的值,我将仅引用前一个单元格。无论哪种方式,您可能需要使用@ErraticAttack提到的 Row() 函数。
我附上一个例子来说明。