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