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に変えることができます。また、暗黙の変換を自由に実行するように弱く型付け されています。intを追加して、元々ブール値の「ベクトル」であったものにフロートする方法を参照してください。通常、ブール値は数字であるかのように扱い、数字は文字列であるかのように扱うことができます。

于 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

関数は 2 つのクラス システムを介してポリモーフィックに作成されます。1 つはターゲット クラスを示すピリオド文字に依存し、もう 1 つはオブジェクト クラスのシグネチャに依存します。(そして、関数の命名規則は非常に不安定です。)

オブジェクト指向言語としての R の前提には同意しません。R に来るオブジェクト指向の経験を持つ人々は、R が示すものとは異なる動作を期待します。これは、与えられたオブジェクトを検査するクラス システムとともにディスパッチされる関数型言語ですが、実際のオブジェクト指向言語とは異なります。

于 2013-01-12T23:35:16.527 に答える
8

あなたの質問に例を挙げて答える素晴らしい調査があります: Evaluating the Design of the R Language by F.Morandat et al.

アブストラクトからの引用:

R は、遅延関数機能とオブジェクト指向プログラミングを組み合わせた統計計算用の動的言語です。」

「動的」、「怠惰」などのこれらのキーワードのそれぞれは、このペーパーの例で提供されています (「3. R の 3 つの顔」の章を参照してください)。

著者は次の点を調べました。
– コア 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 <- "こんにちは" (typeof(x) = 文字); x <- 1 (typeof(x) = double)

型の安全性について: x <- 1; y <-「a」

x + y : x + y のエラー : 二項演算子への非数値引数

ただし、paste(x,y) (連結) は機能します: "1 a"

于 2013-01-12T23:09:34.950 に答える