R语言的类型安全性

R语言的类型安全性,r,typing,R,Typing,Wikipedia指出R是“多范式:数组、面向对象、命令式、功能性、过程性、反射性和动态性。但它的类型安全性如何?请举例说明R中可能存在的不同方面/类型的类型安全性,例如: 我们是否得到未检查的运行时类型错误 尝试忽略数据类型的操作或函数调用是否被拒绝 一旦发生类型匹配失败,是否存在定义良好的错误或异常行为(与未定义的行为相反) 数据对象是固定的和固定类型的吗 类型系统是否可以回避 它是否有一个复杂的、细粒度的类型系统和复合类型,并且每个对象是否都有一个定义良好的类型来禁止非法的值和操作 支持

Wikipedia指出R是“多范式:数组、面向对象、命令式、功能性、过程性、反射性和动态性。但它的类型安全性如何?请举例说明R中可能存在的不同方面/类型的类型安全性,例如:

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

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

R是动态类型的

例如: x
你可以看到它是动态的——我可以给变量
a
分配任何东西,并随意更改它。它也是弱类型的,可以自由地执行隐式转换——看看我如何添加int,然后浮动到最初的布尔“向量”“。你通常可以把布尔当作数字来对待,把数字当作字符串来对待。

有一项很好的调查用例子回答了你的问题:F.Morandat等人

摘要引文:

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

本文中的每个关键词“dynamic”、“lazy”等都附有示例(请参阅“3.R的三个方面”一章)

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

–语言评估

运算符和函数的隐式强制在语言中很普遍(并且有参数循环)。大多数情况下,会针对循环发出警告,但不会针对强制发出警告

 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
函数通过两个类系统实现多态性,其中一个依赖于发送目标类信号的周期字符,另一个依赖于对象类签名(函数命名约定非常不稳定)


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

R基本上没有类型s安全。你可以做各种各样的事情,结果都是没有意义的东西

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)

Wikipedia页面的右侧框中写着:
打字规则:动态
。当然,它并没有回答关于强打字或弱打字的问题。我也在一些答案上发布了这一点,但我相信这不会过分强调:。如果你否决了投票,请评论为什么,以便我可以改进这个问题。谢谢你可以代替广告询问语言的特定属性(例如,一些通常被认为是“弱类型”的指示符)。有人告诉你“它是弱类型”并没有告诉你任何事情,所以这是一个毫无意义的问题(实际上比无意义的IMHO更糟糕,因为它保持了这种无意义的分类,从而使人感到困惑)。不确定解释->弱类型”参数是正确的。说Ruby是强类型的,但它仍然被解释。-1 OP说了什么,加上:弱/强类型与静态/动态类型无关(您的示例显示了动态类型)对于大多数弱/强类型的定义,它是。是的,你们两个都是正确的。我改变了这一点。动态的,我同意。但是当你在定义的逻辑->数字->字符的层次结构中分配不同的内容时,向量的模式会改变。Java是强类型的,你仍然可以添加一个int和一个double(在此之前int被转换/加宽)。请不要使用“弱类型”,因为它可以表示任何类型。请说明您实际的意思(例如“允许隐式转换”)。Delnan,同意。相应地更改了问题。谢谢,这看起来非常有趣。
> 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
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)