6

を使用して R から呼び出す継承された FORTRAN77 コードの長い部分があります.Fortran()。Fortran コードには一連のサブルーチンが含まれており、Fortran プログラムに埋め込まれてからコンパイルされ、コマンド ラインから実行されると機能します。ただし、R から呼び出すと、関数を 2 回目に呼び出したときに R がクラッシュします。

Fortran コードは、変数として格納された多くのインデックスと配列の次元を使用するため、何か問題があると思います。ある時点で、Fortran コードはメモリ内の想定外の場所を探しています。そのため、Fortran コードをステップ実行して、R から来たものすべてが私が思っているとおりであり、コードが私が思っているとおりに動作するかどうかを確認する必要があります。

それが R 関数の場合、 を使用しdebug()、ステートメントを追加browser()し、コードのある時点で見たい値を出力するという選択肢があります。しかし、Fortran コードでは、これらのことは何も許可されていません。私の理解が正しければ、Fortran の画面出力は R によってキャプチャされません。

R が Fortran コードに渡す引数の型と値を正確にチェックする方法を知っている人はいますか? Rから呼び出されたときにそのコードを後でデバッグする方法を説明できれば、それは素晴らしいことです。

これが私の言いたいことを説明するための例です。

C An example program
C
      PROGRAM EXAMPLE
      INTEGER N
      PARAMETER (N=10)
      REAL X0, X(N),MEAN

C
      X0 = 14
      DO 10 I = 1,10
         FI = FLOAT(I)
         X(I) = X0 + FI
   10 CONTINUE
      CALL MYSUB(X0,MEAN)
      END
C
C Mysub the subroutine
C
      SUBROUTINE MYSUB(X,N,MEAN)
      INTEGER N
      REAL X(N), MEAN
      MEAN = 0
      DO 20 I = 1,N
         MEAN = MEAN + X(I)
   20 CONTINUE
      MEAN = MEAN / N
      RETURN
      END

R からサブルーチン mysub を呼び出し、X と N が正しく取得されるようにしたいとします。私は次の機能を使用します:

mysub <- function(x){
    if(!is.vector(x) | is.numeric(x)) stop("X has to be a numeric vector")
    n <- length(x)
    res <- .Fortran('mysub',X=as.single(x), N=as.integer(n), MEAN=single(1))
    return(res$MEAN)
}
4

1 に答える 1

4

サンプル プログラムでは、MYSUB の定義にある 3 つの引数の代わりに、2 つの引数だけで MYSUB を呼び出します: (X, N, MEAN)

これはおそらくあなたの質問とは関係ありませんが、FORTRAN と引数のデバッグについて尋ねているので、指摘する必要があると思いました。FORTRAN サブルーチンは独立したコンパイルです。間違った数の引数を渡さないようにするものは何もなく (コンパイラ エラーやリンケージ ヒントはありません)、これにより問題が発生する可能性があります。

于 2014-02-21T22:20:02.670 に答える