rからcまで任意の列(整数/係数、数値、文字データ)を持つデータフレームを渡す一般的な方法はありますか?十分に近い例へのポインタは非常に高く評価されるでしょう。.call()を使用してRとCからデータフレームを渡す
ありがとうございました。
RT
rからcまで任意の列(整数/係数、数値、文字データ)を持つデータフレームを渡す一般的な方法はありますか?十分に近い例へのポインタは非常に高く評価されるでしょう。.call()を使用してRとCからデータフレームを渡す
ありがとうございました。
RT
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レベルでより複雑なオブジェクトの操作を維持していると思います。
はここディルクEddelbeuttelによってlink to an example using C++ and package inlineです:
お返事ありがとうございます。私は設計通りに制限されているので、C++はオプションではありません。 – user151410
おそらく '[< - ' ??? –
なぜCの制限? Rの場合、gccを使用することになります。これは、g ++を簡単に使用できることを意味します。簡単なAPIは毎回より難しいAPIよりも優先されます。ああ、DWinが指す例は、data.frameも簡単に返すことができます。 –
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)
これは私が探していたものです。 Martinに感謝します。 DFを渡すときにデータフレーム(nrows、rownames、colnames、is.factorなど)の他の属性を照会し、DFを返すときに設定できますか? RT – user151410
答えの最後にこれについていくつかの文を追加しました –
ありがとうございました。それは助ける。 RT – user151410