关于打字:语言的类型安全方面是R.

Aspects of type-safety of language is R

维基百科指出,R是"多范式:数组、面向对象、命令式、功能性、过程性、反思性和动态性"。但是它的类型安全呢?请举例说明R中可能的类型安全的不同方面/种类,例如

  • 我们是否会得到未选中的运行时类型错误?
  • 试图忽略数据类型的操作或函数调用是否被拒绝?
  • 一旦类型匹配失败,是否存在定义良好的错误或异常行为(与未定义的行为相反)?
  • 数据对象是固定的还是不变的类型?
  • 类型系统可以被回避吗?
  • 它是否有一个复杂的、细粒度的类型系统和复合类型,并且每个对象是否都有一个定义良好的类型来禁止非法的值和操作?
  • 支持隐式类型转换(已经有一些答案显示了这一点,谢谢)。

这些问题来源于维基百科(http://en.wikipedia.org/wiki/strong_typing),因为强/弱类型太模糊,无法提出要求(感谢Delnan在此澄清)。


1
2
3
4
5
6
7
8
9
10
11
12
> a = TRUE
> a
[1] TRUE
> a[3] = 1
> a
[1]  1 NA  1
> a[5] = 3.14
> a
[1] 1.00   NA 1.00   NA 3.14
> a ="Ala"
> a
[1]"Ala"

你可以看到它是动态的——我可以给变量a分配任何东西,然后随意更改它。它还弱类型化自由地执行隐式转换-请参见如何添加ints,然后浮动到最初的布尔"vector"中。通常可以将布尔值视为数字和数字,就好像它们是字符串一样。


运算符和函数的隐式强制在语言中广泛存在(并且它具有参数循环)。在回收过程中,大部分时间都会发出警告,但不是强制的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 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的参数的长度是长度最长的向量的偶数倍,那么这些参数将在不发出警告的情况下被循环使用:

1
2
3
4
5
6
7
8
9
10
11
> 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作为面向对象语言的前提。有面向对象经验的人会期望一个与它所展示的不同的行为。它是一种功能性语言,与检查给定对象的类系统一起调度,但它不像真正的面向对象语言。


有一个很好的调查用例子来回答你的问题:F.Moranda等人对R语言的设计进行评估。

摘要引文:

R is a dynamic language for statistical computing that combines lazy functional features and object-oriented programming"

这些关键词中的每一个"动态"、"懒惰"等都有本文中的例子(请看第3章)。R")的三个面。

作者通过以下几点:—核心R的语义–他们建立了一个R程序库并对其进行了评估。–实施评估–语言评估


R基本上没有类型安全性。你可以做各种以无意义的事物结束的事情。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
x <- lm(Sepal.Width ~ Sepal.Length, data=iris)
x
## Call:
## lm(formula = Sepal.Width ~ Sepal.Length, data = iris)
##
## Coefficients:
##  (Intercept)  Sepal.Length  
##      3.41895      -0.06188  

opar <- par(mfrow=c(2,2))

plot(x)                  # Note generated plot results.
par(opar)


class(x) <-"data.frame"
plot(x)
Error in data.matrix(x) :
  (list) object cannot be coerced to type 'double'
x
## [1] coefficients  residuals     effects       rank          fitted.values assign        qr            df.residual  
## [9] xlevels       call          terms         model        
## <0 rows> (or 0-length row.names)

R是动态类型的。

例子:x<-"hi"(typeof(x)=character);x<-1(类型(x)=double)

关于类型安全:x<-1;y<-"a"

x+y:x+y中的错误:二进制运算符的非数字参数

但是,Paste(x,y)(串联)的工作原理是:"1a"