这是my previous question的后续行动。不同之处在于,我想获得一个二维数组而不是一维数组。
我有以下Fortran子程序:
subroutine test(d, i, nMCd, DF, X)
integer, intent(in) :: d, i, nMCd
double precision, intent(in), dimension(i,nMCd) :: DF
double precision, intent(out), dimension(i,nMCd) :: X
X = DF + DF
end subroutine test
在R中,代码很简单:
input <- data.frame(A=c(11,12), B=c(21, 22))
input + input
我得到一个2乘2的数据框
我可以编译它来为R加载并运行它。
system("R CMD SHLIB ./Fortran/mytest.f90")
dyn.load("./Fortran/mytest.so")
X <- .Fortran("test", d = as.integer(1), i = nrow(input), nMCd = ncol(input), DF = unlist(input), X = numeric(nrow(input)*ncol(input)))$X
但是我得到一个长度为4的向量而不是2x2矩阵或数据帧。我尝试了X = numeric(nrow(input), ncol(input))
,但它不起作用
我能想到的唯一解决办法是在运行fortran函数后运行
matrix(X,nrow = nrow(input),ncol = ncol(input))
谢谢!
答案 0 :(得分:1)
我已经查看了.Fortran
,.Call
和“编写R扩展”的文档,但没有找到Fortran子例程返回矩阵的任何实例。此外,?.Fortran
帮助页面中没有矩阵类型,因此我认为我的评论可能是最佳解决方案:
in R you can also coerce a vector to matrix by adding a dimension: dim(X) <- c(2,2).
Or even with more generality: dim(X) <- dim(input)
显然我不能声称这是来自高权威,因为我之前没有做过任何Fortran编程。如果您有兴趣编写与R对象交互的代码,您可能需要考虑研究data.table
包的代码。大多数此类努力使用C或C ++。您可能还会考虑Rcpp或内联包接口。 Fortran接口主要用于利用已经防弹的许多数字函数。