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" |
你可以看到它是动态的——我可以给变量弱类型化自由地执行隐式转换-请参见如何添加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 |
但是,如果
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"