R での処理方法: 「closure」型のオブジェクトはサブ定義可能ではありません


R で発生する可能性のあるエラーは次のとおりです。

 object of type 'closure' is not subsettable

このエラーは、関数をサブセット化しようとすると発生します。

R では、リスト、ベクトル、行列、データ フレームをサブセット化することができますが、関数のタイプは「クロージャ」であり、サブセット化することはできません。

このチュートリアルでは、このエラーを解決する方法を正確に説明します。

エラーを再現する方法

ベクトルの各値を取得して 5 を乗算する次の関数を R で作成するとします。

 #define function
cool_function <- function (x) {
  x <- x*5
  return (x)
}

この関数を実際に使用する方法は次のとおりです。

 #define data
data <- c(2, 3, 3, 4, 5, 5, 6, 9)

#apply function to data
cool_function(data)

[1] 10 15 15 20 25 25 30 45

元のベクトルの各値が 5 倍になっていることに注意してください。

ここで、関数のサブセットを試みるとします。

 #attempt to get first element of function
cool_function[1]

Error in cool_function[1]: object of type 'closure' is not subsettable

R では「closure」型のオブジェクトをサブセット化できないため、エラーが発生します。

次の構文を使用して、関数が実際に「クロージャ」タイプであるかどうかを確認できます。

 #print object type of function
typeof(cool_function)

[1] “closure”

「クロージャ」オブジェクトのその他の例

R のすべての関数は「クロージャ」タイプです。たとえば、R ベースの関数をサブセット化しようとすると、次のエラーが発生します。

 #attempt to subset mean function
mean[1]

Error in mean[1]: object of type 'closure' is not subsettable

#attempt to subset standard deviation function
sd[1]

Error in sd[1]: object of type 'closure' is not subsettable

#attempt to subset table function
tabld[1]

Error in table[1]: object of type 'closure' is not subsettable

エラーの解決方法

このエラーを解決する方法は、単純に関数の過小定義を避けることです。

たとえば、前のCool_function をベクトルの最初の要素にのみ適用したい場合は、次の構文を使用できます。

 #apply function to just first element in vector
cool_function(data[1])

[1] 10

関数ではなくベクトルをサブセット化しているため、エラーは発生しません。

または、 cool_function をベクトル全体に適用することもできます。

 #apply function to every element in vector
cool_function(data)

[1] 10 15 15 20 25 25 30 45

関数のサブセット化をまったく試みていないため、エラーは発生しません。

追加リソース

次のチュートリアルでは、R の他の一般的なエラーを解決する方法について説明します。

修正方法: 条件の長さが 1 を超えており、最初の要素のみが使用されます。
R での修正方法: dim(X) は正の長さでなければなりません
Rで修正する方法: true/falseが必要な場所に値がありません
修正方法: 強制によって導入された NA

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です