从子程序输出到R?得到n维Fortran数组?

时间:2015-07-22 19:43:14

标签: r fortran gfortran

我有以下Fortran子程序:

function destroyer (arr) {
  // You can use slice to grab all arguments after the first index in arguments
  var args = Array.prototype.slice.call(arguments, 1);

  return arr.filter(function (item) {
    // filter anything not found in the arguments list
    // indexOf will return -1 if not found
    return args.indexOf(item) < 0;
  });
}

我可以编译它为R加载并运行它。但是没有得到一个阵列,我得到一个数字。

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)         :: X

    X = DF(:,d)+DF(:,d)

end subroutine test

我做错了什么?!

我的输出看起来像

system("R CMD SHLIB ./Fortran/mytest.f90")
dyn.load("./Fortran/mytest.so")

input <- data.frame(A=c(11,12), B=c(21, 22))
.Fortran("test", d = as.integer(1), i = nrow(input), nMCd = ncol(input), DF = unlist(input), X = as.numeric(1))

这个版本的R版本是:

$d
[1] 1

$i
[1] 2

$nMCd
NULL

$DF
A1 A2 B1 B2 
11 12 21 22 

$X
[1] 22

1 个答案:

答案 0 :(得分:2)

我还没弄明白这应该做什么,因为我没有在FORTRAN中编程(而且你没有用我所读的语言说出你所期望的),但这是提供输入对象第一列中项目总和的实验,当我用输入查看代码时可能会有所帮助。似乎有可能从1发送d来从DF(:,d)+ DF(:,d)中提取可能意味着您需要第一列的总和。请注意,我刚刚向X提供了一个空的4元素向量,并使其Fortran维度与DF相同:

文件来源:

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(i)

    X = DF(:,d)+DF(:,d)

end subroutine test

R代码:

input <- data.frame(A=c(11,12), B=c(21, 22))
.Fortran("test", d = as.integer(1), i = nrow(input), nMCd = ncol(input),
                      DF = unlist(input), X = numeric(4))
#--- result------
$d
[1] 1

$i
[1] 2

$nMCd
[1] 2

$DF
A1 A2 B1 B2 
11 12 21 22 

$X
[1] 22 24  0  0

进一步的实验,仍然不知道Fortran,尝试将第一行中的项目一起添加:

  X = DF(d,:)+DF(d,:)

制作人:

 $X
 [1] 22 42  0  0