我有一長串繼承的FORTRAN77代碼,我使用.Fortran()
從R調用。 Fortran代碼包含一組子程序,當嵌入到Fortran程序中並隨後通過命令行進行編譯和運行時,Fortran代碼就可以工作。但是,當我從R調用它時,它會在第二次調用該函數時使R崩潰。從內部調試Fortran代碼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)
}
這是一個非常平凡的問題,但爲什麼不寫入文件中輸入Fortran子例程的數量而不是屏幕?通過這種方式,您可以檢查R和Fortran之間的通信是否正常工作。 –
@BálintAradi現在我覺得很愚蠢...... ;-) Thx。 –
嘿,最好的問題看起來很簡單:-) –