为什么总是使用 else 语句以及空值和缺失值之间的根本区别大家好,
这里有一个理论问题。 我目前正在为我的同事编写 JSL 脚本教程,因此我试图确保我对 JSL 的工作方式有很好的理解。
我曾经在论坛上读到,您应该始终在“If”循环中使用“Else”语句,即使这意味着添加 Empty() 作为“Else”语句。
为了看到差异,我尝试使用脚本编辑器:
y=if(1>2, 1);
z= if (1>2, 1 , Empty());
Show (y);
Show (z);
Show (Is Missing (y) );
Show (Is Missing (z) );
Show (Is Empty (y) );
Show (Is Empty (z) );
x= If (y==z, "true", "false");
Show (x); <BR /><BR />// results :<BR />y = .;<BR />z = Empty();<BR />Is Missing(y) = 1;<BR />Is Missing(z) = 1;<BR />Is Empty(y) = 0;<BR />Is Empty(z) = 1;<BR />x = .;
因此,值 Empty() 既是缺失值又是空值,但是“.”缺失但不为空。 这有什么区别呢? 考虑到它们在比较运算符中使用时都会返回缺失值,为什么我要费心使用 Empty() 作为“Else”语句呢?
这也说明了这样一个事实:当 if 语句中测试的条件返回缺失时,它既不是 true 也不是 false,因此循环既不返回这两个语句,这一点始终要记住!
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别FWIW 如果没有 ELSE 条件,我从不使用 ELSE 语句。使我的代码保持简单和紧凑。我知道 if() 是一个函数,并且我知道如何使用它。也许这是我使用过的其他语言的遗留问题。
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别我同意一般的计算机编程,特别是 JMP 脚本编写是严肃的话题。 保存脚本和将其他人编写的脚本拼凑在一起只能让您到目前为止。 通常会导致混乱和沮丧。
很抱歉,我们的培训不是一个选择。 我们的入门课程已经成熟(大约二十年)并且很受欢迎。 我不知道 JSL 是否有任何其他免费或收费的培训。 可能有一些涵盖特定主题的免费视频,但我怀疑它们是否传达了这种心态。 它们通常是“如何做”或“食谱”风格。
也许另一位社区成员知道适合您的培训。
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别嗯,我当然不想因为限制性思维而限制我的创造力。 我想我可能缺乏这方面的培训。 几个月前,我对 JSL 中的脚本进行了评估,主要是迭代现有脚本并查看脚本索引和脚本指南 pdf。 现在我想如果我想释放 JSL 的潜力,我需要做一些更严肃的事情。
您知道用于学习 JSL 的(免费)在线资源吗? 我知道这可能是一个棘手的问题,因为您是一名员工,并且您的公司提供付费课程,但目前这对我来说不是一个选择。
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别你问了一些大问题。
我的基本观点是,与任何计算机编程语言一样,JSL 语法和习惯用法是我们的朋友,但我们不是它们的奴隶。 我的问题是:“你期望什么?”只是想指出,每次编写或修改代码时,我们都需要这个问题的答案。 明确的答案对我们的代码来说至关重要。
是的,函数是编写脚本的关键元素。 根据定义,每个函数都会返回一个结果。 但有时我们对函数的副作用比返回的结果更感兴趣。 例如,V List Box() 函数返回对其创建的显示框对象的引用。 我可能对盒子本身(副作用)比对参考文献更感兴趣。
许多新手脚本编写者认为 If() 和 For() 是语句或命令。 它们是函数。 陈述心态会限制你的创造力。 心态很重要。 以下脚本显示了完成同一件事的两种方法,但具有声明心态的人永远不会想到第二种方法。
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
mean weight = Col Mean( dt:weight );
// assign within the If() function call
dt << New Column( "Condition 1", Numeric, Continuous );
For Each Row(
If( :weight < mean weight, dt:Condition 1 = -1, dt:Condition 1 = 1 );
);
// assign with the returned result from the If() function call
dt << New Column( "Condition 2", Numeric, Continuous );
For Each Row(
dt:Condition 2 = If( :weight < mean weight, -1, 1 );
);
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别嗨马克贝利,
感谢您的这些见解:)事实上,我认为必须使用 Empty() 作为 else 语句很奇怪。 我试图寻找提到这种做法的帖子,但再也找不到了,所以我无法询问用户为什么他认为这很有用。
回答你的问题:你想用条件 If() 函数做什么? 你期望它返回什么?
人们很容易忘记 JSL 是一种基于函数的语言并且函数有返回值。 所以通常情况下,我并不真正使用 If 语句返回的内容。 我只是将其作为理解 JSL 基础知识的一种方式进行探索。 在实践中,我想知道使用 If 语句的返回值有什么用?
我能想到的就是在脚本中获得空间或使其更快一点。 但感觉如果我尝试以这种方式变得聪明,它会在以后困扰我并产生错误/错误。
您对此有何看法?
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别我使用 Is Empty() 的方法是查看变量是否已被分配。从而避免语法错误:
names default to here(1);
show(z);
我们可以检查变量“z”是否被引用过:
Names Default To Here( 1 );
If( Is Empty( z ) == 0,
Show( z )
);
一个更好的例子是下面的例子。
Names Default To Here( 1 );
x=1;
If( x > 2, z = 7 );
If( Is Empty( z ) == 0,
Show( z )
);
由于 JSL 是一种解释性语言,因此它遵循 JSL 的逻辑流程,因此,如果 x <= 2,JSL 将不会执行(甚至不看)z = 7,因此无需检查 z 是否为 Empty()是必需的,因为 JSL 会给出语法错误。
在您的示例中,您使用不同的形式将值分配给 z
names default to here(1);
z=(if(1>2, 7));
show(z);
如果 1>2,则变量 z 的值为 7,但如果不为 true,则 z 不再未分配,因此它将呈现缺失值“.”。这样做的优点是,一旦进行赋值,JSL 就已经处理了变量 z,并且如果稍后在程序流程中引用 z,则不会出现语法错误。
这给我们带来了一个问题:如果 If() 函数返回 false,我们是否应该分配 Empty() 。
names default to here(1);
z=(if(1>2, 7, Empty()));
show(z);
然后简单地归结为,您是否不想让 z 作为缺失值,而宁愿检查 Is Empty() 与 Is Missing()。我个人更喜欢缺失值路线,因为它留下 Empty() 作为 z 从未被分配的验证。 。
回复:为什么总是使用 else 语句以及空值和缺失值之间的根本区别我编写脚本的时间比大多数人都长(1998 年)。 我是我们所有脚本课程的作者并教授这些课程。 我不知道“最佳实践”建议始终包含“else”条件的参数或使用空的在没有特定返回值的情况下。 我当然从未错过过它,也从未因不使用它而付费。 我认为这个问题是“视情况而定”的另一种情况。 你想用条件做什么如果()功能? 你期望它返回什么?
默认返回值如果()函数是丢失的当第一个参数的计算结果为 false 并且只有两个参数时。 您使用存储在中的值演示了此行为y 。 这如果()自 2000 年 JSL 首次在 JMP 4 中引入以来,该函数就一直如此。
您可以提供第三个参数如果()当第一个参数计算结果为 false 时计算并返回的函数。 您使用存储在中的值演示了此行为z你提供的地方空的()函数作为第三个参数。
丢失的代表一个未知值。 它通常表示未知的数据值或评估不可能的数值表达式(例如 Log( -1 ))的结果。 我觉得丢失的作为未由参数表示的条件的默认返回值很有意义。
空的就是这样。 它代表着什么都没有的状态。 例如,如果您致电当前数据表()当没有打开数据表时不带参数,它返回空的。