语言的类型安全方面是R.

Pet*_*ler 12 r typing

维基百科指出R是"多范式:数组,面向对象,命令式,功能性,程序性,反思性和动态性.但是它的类型安全性如何?请用例子解释R中不同方面/种类的可能类型安全性,例如

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

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

zch*_*zch 10

> 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"
Run Code Online (Sandbox Code Playgroud)

你可以看到它是动态的 - 我可以为变量分配任何东西a并随意改变它.它也是弱类型 执行隐式转换 - 看看我如何添加整数然后浮动到最初的布尔"向量".您通常可以将布尔值视为数字和数字,就好像它们是字符串一样.


42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

但是如果参数的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
Run Code Online (Sandbox Code Playgroud)

函数通过两个类系统变成多态的,其中一个系统依赖于信号通知目标类的周期字符,另一个系统依赖于对象类签名.(并且函数命名约定非常不稳定.)

我不同意R作为面向对象语言的前提.来到R的具有面向对象体验的人期望与其展示的行为不同.它是一种用类系统调度的函数式语言,它检查给定的对象,但它不像真正的面向对象语言.


Max*_* Li 8

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

来自摘要的引文:

R是统计计算的动态语言,它结合了懒惰的功能特性和面向对象的编程"

这些关键词"动态","懒惰"等中的每一个都与本文中的例子一起提供(参见"3.R的三个面"一章).

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


小智 1

R 是动态类型的。

示例:x <- "hi" (typeof(x) = 字符); x <- 1(typeof(x) = 双精度)

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

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

然而,paste(x,y)(这是一个串联)可以工作:“1 a”

  • 不确定“解释 -&gt; 弱类型”参数是否正确。http://en.wikipedia.org/wiki/Strong_typing 说 Ruby 是强类型的,但它仍然是解释性的。 (3认同)