2015-05-08 66 views
1

我剛剛開始Rcpp所以這可能是一個非常愚蠢的問題。下面是具體問題(上下文下面提供)連接和Rcpp中的列表

什麼是Rcpp相當於

odes <- c(A = 1.0, B = 2.0, C = 3.0, D = 4.0, E = 5.0, F = 6.0, G = 7.0) 
list(odes) 

語境 - 我使用deSolve包的vode求解試圖解決常微分方程(常微分方程)的系統,但是使用Rcpp包在編譯代碼中寫入ODE的右側。求解器預計形成微分方程的RHS的功能,在這種情況下,從一個.R函數返回一個列表,特別是RHS(該解算器能夠成功G642.44各級)是形式

> X 
[[1]] 
    9000000.00  -9000000.00   0.00  19993.04  -19993.04  -19993.04  -9000000.00 

,我想的我的.cpp文件以類似形式的列表吐出odes

任何幫助在這裏將不勝感激!

如下建議,我將代碼粘貼到顯示正是我在做

#include <Rcpp.h> 
using namespace Rcpp; 

// This is a simple example of exporting a C++ function to R. You can 
// source this function into an R session using the Rcpp::sourceCpp 
// function (or via the Source button on the editor toolbar). Learn 
// more about Rcpp at: 
// 
// http://www.rcpp.org/ 
// http://adv-r.had.co.nz/Rcpp.html 
// http://gallery.rcpp.org/ 
// 

// [[Rcpp::export]] 
List odes_gprotein(double t, NumericVector A, NumericVector p) { 

    NumericVector odes_vec(A.length()); 
    List odes(1); 

    double Flux1 = p[1] * A[4] * A[5] - p[0] * A[3]; 
    double Flux2 = p[2] * A[5] - p[3]; 
    double Flux3 = p[4] * A[3]; 
    double Flux4 = p[5] * A[1] * A[6]; 
    double Flux5 = p[6] * A[0] * A[3]; 
    double Flux6 = p[7] * A[2]; 

    odes_vec[0] = (Flux4 - Flux5); 
    odes_vec[1] = (-Flux4 + Flux6); 
    odes_vec[2] = (Flux5 - Flux6); 
    odes_vec[3] = (Flux1 - Flux3); 
    odes_vec[4] = (-Flux1); 
    odes_vec[5] = (-Flux1 - Flux2); 
    odes_vec[6] = (-Flux4 + Flux5); 

    odes = List(odes_vec); 
    return odes; 
} 

該函數返回時(我公司供應的tpA一些值)以下,

> Rcpp::sourceCpp('odes_gprotein.cpp') 
> X <- odes_gprotein(0,IC,p) 
> str(X) 
List of 7 
$ : num 9e+06 
$ : num -9e+06 
$ : num 0 
$ : num 19993 
$ : num -19993 
$ : num -19993 
$ : num -9e+06 

然而,我需要的是X上述

> X 
[[1]] 
    9000000.00  -9000000.00   0.00  19993.04  -19993.04  -19993.04  -9000000.00 
如前所述

其中

str(X) 
List of 1 
$ : num [1:7] 9e+06 -9e+06 0e+00 2e+04 -2e+04 ... 

謝謝您的建議!

+0

你到目前爲止嘗試過什麼?你是否實例化了一個'Rcpp :: List'對象? –

+0

感謝您的回覆,我已經實例化了一個Rcpp :: List,但我認爲還有一個問題,'odes'和'X'在結構上並不完全相同,我不確定爲什麼'> str(odes) 名稱num [1:7] 1 2 3 4 5 6 7 - attr(*,「names」)= chr [1:7]「A」「B」「C」「D」... > str(X) 列表1 $:命名的數字[1:7] 9e + 06 -9e + 06 0e + 00 2e + 04 -2e + 04 ... ..- attr(*,「 「)= chr [1:7]」A「」B「」C「」D「...',而'X'是1的列表,'odes'是'Named' – SN248

+0

我試過使用'List odes(1);',然後'odes [1](0)= 1.0',我意識到這給出了一個沒有'names'的列表,但基本上我想要一個'list'列表,它的形式'X'高於 – SN248

回答

3

我們還是真的不知道你想要或試了一下,但這裏是一個最小的存在性證明你:

R> cppFunction('List mylist(IntegerVector x) { return List(x); }') 
R> mylist(c(2:4)) 
[[1]] 
[1] 2 

[[2]] 
[1] 3 

[[3]] 
[1] 4 

R> 

在進入一個向量,就出來了名單。看看Rcpp的例子,例如Rcpp Gallery網站。

+0

@DirkEddebuettel - 感謝您的評論,我從你的回答[這裏]找到一個提示(http://stackoverflow.com/questions/3088650/how-do-i-create-a-list-of-vectors-in- RCPP)。我必須刪除'List odes(1);','List(odes_vec);'和'return odes;'並添加'return Rcpp :: List :: create(odes_vec);' – SN248

1

原來我創造了一個錯誤的方法List,我不得不刪除以下

List odes(1);List(odes_vec);return (odes);,不得不在最後添加以下語句

return Rcpp::List::create(odes_vec); 

更好可以找到解釋here