使用带有空 while 条件的 For 循环迭代关联数组不起作用我的建议主要来自循环关联数组的元素关于如何迭代关联数组。 我的理解是,迭代器迭代键,而不是值,但是只要您拥有数组,您就可以轻松访问这些值。
我的代码如下。
Names Default To Here(1);
dt1 = Open("file path" );
dt2 = Open("file path 2");
Summarize(dt1, IDs = by(:ID)); //this finds all the unique IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the dt1 data file which we will then copy over to the dt2 data file.
For (i=1, i<=N Items(IDs), i++,
ID = IDs[i];
temp_array = Associative Array ({"Val1","Val2","Val3"},{{},{},{}});
For ( temp = temp_array << First, Is Empty(temp_array[temp]), temp = temp_array << Next(temp),//looping through temp_array's keys is clunky but done this way in JMP
query_date = dt1 << Select Where (:"ID" == ID);
Write(query_date);
//etc not there yet because the above not working
);
);
在我的旅程中,此时感兴趣的变量是 query_date,我需要继续。问题是,正如所写的那样,由于某种原因,内部循环甚至不运行一次。 循环中的 while 条件应评估为 True,直到我希望循环终止,因此我将其设置为
Is Empty(temp_array[temp])
因为 temp_array[temp] 是关联数组中的第一个值,其中 temp 是第一个键“Val1”,值为 {}。 我想一个重要的问题是:Is Empty() 中的 {} 计算结果是 True 还是 False? 我什至无法用谷歌搜索这个,因为 {} 是谷歌不处理的特殊字符。 所以你可以明白我为什么感到困惑。
我已经把脚本的其余部分编码出来了,而且我相当有信心它在这一点上会出现一些小错误,所以如果我能克服这个障碍,那将会有很大帮助。 伪代码在我的脑海中非常清晰,作为一个新的 JMP JSL 用户,事情变得更加清晰,对此我很感激。 感谢大家的帮助!
麦克风
数据存取回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用这是一些 CSV 格式的匿名数据(附后),包括相关列 ID、日期以及我有兴趣使用的其他一些列。
让我知道这是否有帮助。 我愿意继续对话,以帮助找到这个问题的答案。
麦克风
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用是的,请给我一点时间。 我必须快速匿名化所有数据和标识符......
麦克风
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用如果变量和列名称相同,您将收到范围错误消息。例如,您有一个列和一个名为 ID 的变量。还有查询日期。
保留您的列名称(更容易),并更改变量名称。例如:ID 和 one_id、:query_date 和 one_query_date。
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用你能提供一个样本数据表吗?回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用我在跑
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
只是为了检查选择 theRows 是否有效,但看起来我们还没有做到这一点。 它打印:
[](0, 1)
对于循环中的每次迭代,它应该从数据表中打印非常全面的行(最多 20 列)。 我不知道发生了什么事。
为了尝试帮助回答您隐含的问题,theRows 只是一个临时变量,用于查找与循环中指定的值匹配的 ID 列值所产生的行(由于 ID 的多个副本,可能存在多行这种性质)。
我意识到这很令人困惑……但这也是我挣扎的原因。
提前致谢,
麦克风
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用好吧……我猜的。您表示您需要找到 query_date,并且它似乎与您的 SelectWhere() 有关。所以我猜测在您的数据表中,有一个名为 query_date 的列,并且 SelectWhere() 或 Get RowsWhere() 将返回具有所需查询日期的行。显然我对在哪里可以找到查询日期的猜测是错误的。
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用嗨克雷格。 这似乎有效。 非常感谢。
迈克尔
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用谢谢你的回复,吉姆。 一件事:我不明白
query_date = dt1:query_date[ theRows[1] ];
因为 query_date 尚未实例化。
这是一个错字吗(应该是一个不同的变量)?
日志也在这里抛出错误:
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
我通常会自己解决这个问题,但事实证明这个问题非常具有挑战性,所以我不完全确定。
非常感谢,
麦克风
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用谢谢你,吉姆。 你的快速反应真是太好了。 我很感激。 现在是周末,请给我一点时间来再次解析所有这些内容。
麦克风回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用我不明白你为什么使用关联数组?您能否详细说明您所设想的尝试执行的循环应该执行的操作?
IsEmpty() 是一个函数,如果脚本不知道引用的项是什么,则返回 1;如果引用的项在 IsEmpty() 执行之前已在脚本中使用过,则返回 0。
所以:
a={};
isEmpty(s);
// returns 0 since a has been referenced prior in the script
isEmpty(b);
// returns 1 since JMP has not seen the variable b before
关于
query_date = dt1 << Select Where (:"ID" == ID);
SelectWhere() 执行操作,但不返回任何内容。因此query_date没有值。SelectWhere() 的作用是将数据表中满足选择条件的所有行的选定行状态设置为“打开”。如果数据表中有不止一行具有 ID 值,则会选择多行。也许您正在寻找的是所选行的查询日期值。可以获取选中行的行号
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
它返回行号矩阵,而不是缩放器。因此,要获取query_date,您必须引用下标。
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
不需要选择步骤的更简单的形式是使用 Get RowsWhere()。
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
我希望我能有所帮助而不是造成混乱。请继续提问。
回复:使用带有空 while 条件的 For 循环迭代关联数组不起作用for循环的条件需要在键不为空时运行
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
关联数组的 <<
这 !是个不是操作员。
编辑:你可能想要这样的东西
temp_array = Associative Array( {"Val1", "Val2", "Val3"}, {{1, 2}, {}, {3, 4, 5}} );
For( temp = temp_array << First, !Is Empty( temp ), temp = temp_array << Next( temp ),
If( N Items( temp_array[temp] ) > 0,
Write( "\!nkey=", temp, " has ", N Items( temp_array[temp] ), " elements" ),
Write( "\!nkey=", temp, " has no elements" )
)
);key=Val1 有 2 个元素
key=Val2 没有元素
key=Val3 有 3 个元素