2011-07-12 9 views

答えて

15

data.frameがリストされ、

#include <Rdefines.h> 

SEXP df_fun(SEXP df) 
{ 
    int i, len = Rf_length(df); 
    SEXP result; 
    PROTECT(result = NEW_CHARACTER(len)); 
    for (i = 0; i < len; ++i) 
     switch(TYPEOF(VECTOR_ELT(df, i))) { 
     case INTSXP: 
      SET_STRING_ELT(result, i, mkChar("integer")); 
      break; 
     case REALSXP: 
      SET_STRING_ELT(result, i, mkChar("numeric")); 
      break; 
     default: 
      SET_STRING_ELT(result, i, mkChar("other")); 
      break; 
     }; 
     UNPROTECT(1); 
    return result; 
} 

の線に沿って、その後R CMD SHLIB df_fun.c

> dyn.load("df_fun.so") 
> df=data.frame(x=1:5, y=letters[1:5], z=pi, stringsAsFactors=FALSE) 
> .Call("df_fun", df) 
[1] "integer" "other" "numeric" 

使用GET_CLASS,GET_ATTR Rdefines.h(またはgetAttribのような同等の機能)の他のマクロを使用して、データフレームに関する他の情報を検出します。ただし、data.frameにはその構造と異なるAPIがあります。たとえば、R関数row.namesは、row.names属性に格納されている値とは異なる値を返すことができます。ほとんどの.Call関数は原子レベルのベクトルで動作し、Rレベルでより複雑なオブジェクトの操作を維持していると思います。

+0

これは私が探していたものです。 Martinに感謝します。 DFを渡すときにデータフレーム(nrows、rownames、colnames、is.factorなど)の他の属性を照会し、DFを返すときに設定できますか? RT – user151410

+0

答えの最後にこれについていくつかの文を追加しました –

+0

ありがとうございました。それは助ける。 RT – user151410

3

はここディルクEddelbeuttelによってlink to an example using C++ and package inlineです:

+0

お返事ありがとうございます。私は設計通りに制限されているので、C++はオプションではありません。 – user151410

+0

おそらく '[< - ' ??? –

+0

なぜCの制限? Rの場合、gccを使用することになります。これは、g ++を簡単に使用できることを意味します。簡単なAPIは毎回より難しいAPIよりも優先されます。ああ、DWinが指す例は、data.frameも簡単に返すことができます。 –

0

data.frame typeは "data.frame"属性のリストです。

これはR (SRC /ライブラリ/統計情報/ SRC/model.c)のソースにdata.frameを作成する例です:あなたは data.frame手動でこれをシミュレートすることができ

/* Turn the data "list" into a "data.frame" */ 
/* so that subsetting methods will work. */ 

PROTECT(tmp = mkString("data.frame")); 
setAttrib(data, R_ClassSymbol, tmp); 
UNPROTECT(1); 

way:

l <- list(1:5) 
attr(l, "class") <- "data.frame" 
attr(l, "names") <- "Column 1" 
attr(l, "row.names") <- paste("Row ", 1:5) 
関連する問題