运算符和函数的隐式强制在语言中很普遍(并且它具有参数回收)。大部分时间都发出警告是为了回收,而不是为了强制。
a <- c(TRUE, FALSE)
b <- c(-4:4)
a < b
#[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
#Warning message:
#In a < b : longer object length is not a multiple of shorter object length
c(a,b)
# [1] 1 0 -4 -3 -2 -1 0 1 2 3 4
a + b
[1] -3 -3 -1 -1 1 1 3 3 5
# Standard Warning message re: multiple of shorter object length
> data.frame( a =a, b=b)
Error in data.frame(a = a, b = b) :
arguments imply differing number of rows: 2, 9
但是,如果参数的data.frame
长度是最长向量的偶数倍,它们会在没有警告的情况下被回收:
> data.frame( a =c(TRUE,FALSE,TRUE), b=b)
a b
1 TRUE -4
2 FALSE -3
3 TRUE -2
4 TRUE -1
5 FALSE 0
6 TRUE 1
7 TRUE 2
8 FALSE 3
9 TRUE 4
函数通过两个类系统进行多态化,其中一个依赖于表示目标类的句点字符,另一个依赖于对象类签名。(而且函数命名约定非常不稳定。)
我不同意 R 作为面向对象语言的前提。具有面向对象经验的人使用 R 时期望的行为与其表现出的行为不同。它是一种与检查给定对象的类系统一起调度的函数式语言,但它不像真正的面向对象语言。