我注意到有一些实例,其中算术运算符(在反引号中)就好像它是一个算术函数.
算术运算符:
> `+`(4, 5)
[1] 9
Run Code Online (Sandbox Code Playgroud)
算术函数:
> sum(4, 5)
[1] 9
Run Code Online (Sandbox Code Playgroud)
然而,算术运算符并不像典型的算术函数那样在矢量中实现这一点:
> `+`(1:5)
[1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
是否有任何算术运算符优于算术函数的实例?
42-*_*42- 11
对于标题中的问题,我会说..或通常.在R中,我们经常并行地处理列或向量,即,在作为相同情况或主题的一部分的意义上的向量物质中的值的顺序.在您的示例中,您实际上看到了三种不同的功能:
第一个:一元'+'运算符,在给定数字向量时基本上什么都不做,但在给定逻辑向量时会强制执行数字:
> `+`(-3:3)
[1] -3 -2 -1 0 1 2 3
> `+`(c(TRUE,FALSE))
[1] 1 0
Run Code Online (Sandbox Code Playgroud)
请注意,它并没有使所有的返回值的积极的在一个评论指出.
Next:二进制'+`运算符:
> `+`(-3:3, 0:6)
[1] -3 -1 1 3 5 7 9
Run Code Online (Sandbox Code Playgroud)
最后:sum函数,_not_vectorized_并将所有值折叠为其并集的总和:
> sum(-3:3, 0:6, c(TRUE,FALSE) )
[1] 22
Run Code Online (Sandbox Code Playgroud)
二进制文件+还将回收参数(带警告):
> `+`(-3:3, c(TRUE,FALSE) )
[1] -2 -2 0 0 2 2 4
Warning message:
In -3:3 + c(TRUE, FALSE) :
longer object length is not a multiple of shorter object length
Run Code Online (Sandbox Code Playgroud)
当对"并行"向量进行操作时,你经常会想要使用向量化运算符,并且对sum的结果非常失望,只能返回长度为1的值.某些outer依赖于函数参数的函数需要函数被矢量化.
> outer(1:4, 5:8, sum)
Error in outer(1:4, 5:8, sum) :
dims [product 16] do not match the length of object [1]
> outer(1:4, 5:8, "+")
[,1] [,2] [,3] [,4]
[1,] 6 7 8 9
[2,] 7 8 9 10
[3,] 8 9 10 11
[4,] 9 10 11 12
Run Code Online (Sandbox Code Playgroud)
其他人要求返回单个值.而像"mapply"这样的其他一些人在这个问题上是不可知的.
> mapply(sum, 1:4, 5:8)
[1] 6 8 10 12
> mapply("+", 1:4, 5:8)
[1] 6 8 10 12
Run Code Online (Sandbox Code Playgroud)
该Vectorize可用于创建一个版本的非矢量化功能,并在内部它使用mapply返回不同的功能,但也仅限于非基本功能,因为它们没有在他们的形参列表中使用的参数名称(所以你不能向量化sum.)
最后应该注意的是,它们具有不同的优先级,通过咨询可以获得R优先级规则?Syntax.(一元算术运算符的优先级高于二进制算子.函数和括号隐含地具有最高优先级.我看到由于用户定义函数的优先级较高而出现意外情况.)
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |