inline
R で使用する単純な C 関数を作成しました。この関数は、任意のオブジェクトを取り、そのオブジェクト クラスを返す必要があります。私は、 Writing R Extensionsマニュアルに従おうとしました。
getAttrib
およびsetAttrib
関数は、個々の属性を取得および設定します。2 番目の引数は、SEXP
必要な属性のシンボル テーブル内の名前を定義するものです。これらのシンボルやそのようなシンボルの多くは、ヘッダー ファイルで定義されていますRinternals.h
。
さらに、それはまた述べています..
R では、これ
class
は単に名前が付けられた属性で"class"
あるため、そのように処理できます。
だから私はこれを書いた...
# required package
require( inline )
# Simple C function to get "class" attribute of an R object
classC <- cfunction( c(x = "ANY") , '
SEXP out;
PROTECT(out = allocVector(STRSXP, 1));
SET_STRING_ELT(out, 0, mkChar("class"));
UNPROTECT(1);
return getAttrib(x, out) ;
')
しかし、Rオブジェクトのさまざまな異なるクラスでテストするとclass
、 が返されることがありますが、通常は が返されますNULL
。それが機能するオブジェクトタイプ間の接続が表示されないため、どこが間違っているのかわかりません...
# Various classes of objects
con <- file("text.txt")
d <- data.frame( a = 1 )
e <- new.env()
f <- y ~ 1
fun <- function(x) x^2
i <- 1L:10L
l <- list( 1 , 2 , 3 )
m <- matrix( 1 , 10 , 10 )
n <- runif(1)
v <- 1:10
そして、私が得る機能を実行しています...
# Output from the function
classC(con)
#[1] "file" "connection"
classC(d)
#[1] "data.frame"
classC(e)
#NULL
classC(f)
#[1] "formula"
classC(fun)
NULL
classC(i)
NULL
classC(l)
#NULL
classC(m)
#NULL
classC(n)
#NULL
classC(v)
#NULL
私は何が欠けていますか?globalenvironment
最終的には、特定の内のすべてのオブジェクト名のベクトルを返す小さなヘルパー関数を書きたいので、興味がありますclass
。しかし、主にそれは私自身の好奇心と学習のためであり、私は次のようなことができることを知っています:
sapply( ls() , function(x) class( get( x ) ) )