15

维基百科指出 R 是“多范式:数组、面向对象、命令式、函数式、过程式、反射式和动态的。但是它的类型安全性呢?请用示例解释 R 中可能的类型安全的不同方面/种类,例如

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

这些问题来自维基百科(http://en.wikipedia.org/wiki/Strong_typing),因为强/弱类型太模糊而无法要求(感谢 delnan 在这里的澄清)。

4

5 回答 5

11
> 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并随意更改它。它也是弱类型,可以 自由地执行隐式转换- 看看我如何添加整数然后浮动到最初的布尔“向量”。您通常可以将布尔值视为数字,将数字视为字符串。

于 2013-01-12T23:14:45.417 回答
9

运算符和函数的隐式强制在语言中很普遍(并且它具有参数回收)。大部分时间都发出警告是为了回收,而不是为了强制。

 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 时期望的行为与其表现出的行为不同。它是一种与检查给定对象的类系统一起调度的函数式语言,但它不像真正的面向对象语言。

于 2013-01-12T23:35:16.527 回答
8

有一个很好的调查可以通过示例回答您的问题:Evaluating the Design of the R Language by F.Morandat 等人。

摘要中的引用:

R 是一种用于统计计算的动态语言,它结合了惰性函数特性和面向对象编程”

本文中的示例提供了“动态”、“懒惰”等这些关键词中的每一个(参见“3. R 的三个面孔”一章)。

作者经历了以下几点:
– Core R 的语义
– 他们构建了一个 R 程序语料库并对其进行了评估。
– 实施评估
– 语言评估

于 2013-01-12T23:20:10.023 回答
4

R 基本上没有类型安全性。你可以做各种各样的事情,最终得到无意义的对象。

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)
于 2013-01-13T02:39:16.370 回答
1

R 是动态类型的。

示例:x <- "hi" (typeof(x) = character); x <- 1 (typeof(x) = double)

关于类型安全:x <- 1;y <- “一个”

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

但是 paste(x,y) (这是一个连接)有效:“1 a”

于 2013-01-12T23:09:34.950 回答