jhi*_*hin 13 r conventions vectorization
是的我知道,关于R 中vs 的使用,有很多问题(例如参见这个问题),但我没有找到一个专门回答我问题的问题.&
&&
据我了解的不同,
&
是元素方式,矢量化比较,非常类似于其他算术运算.因此,如果两个参数的长度都> 1,则返回长度> 1的逻辑向量.&&
比较两个向量的第一元素,并始终返回长度为1的结果.此外,它的短路:cond1 && cond2 && cond3 && ...
只判断cond2
是否cond1
是TRUE
,等等.这允许类似的东西if(exists("is.R") && is.function(is.R) && is.R())
,特别&&
是在某些情况下严格需要使用.而且,if
发出警告
条件的长度> 1,只使用第一个元素
如果它的条件有多个元素.
从这些预赛来看,我认为在所有不需要短路的声明中,我更愿意这样&
做.&&
if
如果在计算过程中出现问题,我不小心在其中一个&
参数中有一个向量,我会收到警告,这很好.如果没有,一切都很好.
另一方面,如果我使用了&&
,并且在我的计算中出现了问题,并且其中一个&&
参数是向量,我就不会收到警告.这是不好的.如果由于某种原因,我真的想比较两个向量的第一个元素,我认为明确而不是隐含地这样做更清洁.
请注意,这与R程序员之间的共同协议相反,与R docs推荐的内容相反.(1)
因此,我的问题是:除了短路之外,是否有任何理由&&
可以&
在if
声明中表现出色?
(1)引用help(&&)
:
'&'和'&&'表示逻辑AND和'|' 和'||' 表示逻辑OR.较短的形式以与算术运算符大致相同的方式执行元素比较.较长的形式从左到右评估仅检查每个向量的第一个元素.评估仅在确定结果之前进行.较长的形式适用于编程控制流程,通常在"if"子句中是首选.
不,&&
除了短路之外,使用不提供任何优势.
但是,对于控制流程来说,短路是非常可取的,因此它应该是默认的.if
语句不应该采用矢量化参数 - 这就是为什么ifelse
.如果您正在将逻辑向量传递给if
通常,那么您将使用any
或all
为评估将其收缩为单个逻辑值.
短路的主要优点是避免冗长或容易发生故障的步骤(例如互联网连接 - 尽管这些应该通过以下方式处理try
):
#avoiding lengthy calculations
system.time(if(FALSE & {Sys.sleep(2);TRUE}) print("Hello"))
user system elapsed
0.00 0.00 1.99
system.time(if(FALSE && {Sys.sleep(2);TRUE}) print("Hello"))
user system elapsed
0 0 0
#avoiding errors
if(FALSE & {stop("Connection Failed");TRUE}) print("Success") else print("Condition not met")
Error: Connection Failed
if(FALSE && {stop("Connection Failed");TRUE}) print("Success") else print("Condition not met")
[1] "Condition not met"
Run Code Online (Sandbox Code Playgroud)
很明显,为了利用这些功能,您必须事先知道哪些步骤花费的时间最长或容易出错,并适当地构造逻辑语句.
简短的回答:是的,不同的符号使读者的意思更加清晰.
谢谢你这个有趣的问题!如果我可以总结一下,这似乎是我对你所关联问题的答案的这一部分的后续行动,
...只有当你确定向量是长度为1时才想使用长格式.你绝对应该确定你的向量只有长度为1,例如在它们只返回长度为1的布尔值的情况下.如果向量的长度可能> 1,则要使用短格式.因此,如果您不完全确定,则应首先检查,或使用简短形式,然后使用all和any将其缩短为1,以便在控制流语句中使用,如果.
我听到你的问题(给出评论)这样说:但&
和&&
会做同样的事情如果输入是一个长度,所以比短路等,为什么喜欢&&
?也许&
应该是首选,因为如果它们不是长度一个,if
会给我一个警告,帮助我更加确定输入是长度一.
首先,我同意@James的评论,即你可能"夸大了获得警告的价值"; 如果它不是长度1,那么更安全的事情就是适当地处理这个问题,而不仅仅是向前耕作.&&
如果它们不是长度1,你可以提出一个应该抛出错误的案例,也许是一个好案例; 我不知道它为什么会这样做.但是,如果不及时回过头来,我们现在能做的最好的事情就是检查输入确实适合您的使用.
鉴于此,您已经检查以确保您的输入是合适的,我仍然会建议,&&
因为它在语义上提醒我作为读者我应该确保输入是标量(长度为1).我已经习惯了这个提醒对我很有帮助.它遵循以下原则:不同的操作应该具有不同的符号,对我来说,用于标量的操作与矢量化操作的不同之处在于它保证不同的符号.
(不启动火焰战争(我希望),而这也是为什么我喜欢<-
来=
;一个分配变量,一个参数设置功能,虽然在内心深处,这是同样的事情,这是不同的足够在实践中,使不同的符号对我有帮助.)