5

このようなものをインターネットで検索するのに数日を費やした後でも、この問題を説明するものを見つけることができませんでした. (それ以外の場合は非常にお勧めします)「Writing R Extensions」を読んでも、解決策は得られません。したがって、これが私の最も緊急の質問です。

.Fortran(...) 呼び出しを介して関数/サブルーチンパラメーターとして Fortran に関数を渡すことは可能ですか?

これをテストするために 2 つの単純な関数を作成しました。最初は Fortran サブルーチンです (最初に渡そうとした関数を使用するように調整されているため、インターフェイスのちょっと変わった次元になっています)。

subroutine foo(o, x)
    implicit none

    interface
        subroutine o(t, y, param, f)
            double precision, intent(in) :: t
            double precision, dimension(58), intent(in) :: y, param
            double precision, dimension(22), intent(out) :: f
        end subroutine
    end interface

    double precision, dimension(22), intent(out) :: x

    double precision, dimension(58) :: yt, paramt
    integer :: i

    do i = 1, 58
        yt(i) = rand(0)
        paramt(i) = rand(1)
    end do

    call o(dble(4.2), yt, paramt, x)
end subroutine

上記の関数に渡す単純な R 関数:

asdf <- function(a, s, d, f){x <- c(a, s, d, f)}

yield を呼び出して " .Fortran("foo", asdf, vector(mode="numeric", length=22))asdf Error: invalid mode (closure) to pass to Fortran (arg 1)" (文字列として) を渡すと、引数が期待される型 (つまり、関数) に明らかに適合しないため、segfault が発生します。

参考までに、コードが意味のあることをすることは期待していません(それは別の関数のタスクになります)。主に知りたいのは、Rから関数(または関数ポインター)を渡すことがまったく可能かどうか、または与えるほうがよいかどうかですすぐにこのアプローチに取り組み、うまくいく可能性のあるものを探してください。

前もって感謝します、

ディーン

4

1 に答える 1

2

を介してRオブジェクトを渡すことはできません.Fortran。RオブジェクトをC/C ++コードに渡すには、.Callまたはインターフェイスを使用する必要があります。.External

R関数のC/C ++ラッパーを記述して、Fortranコードから呼び出すことができます(「R拡張機能の記述」の「 Calling-C-from-FORTRAN-およびその逆」を参照)。

于 2012-07-24T13:10:55.093 に答える