2014-07-22 74 views
1

我知道.Fortran下面的代碼調用Fortran子程序,但爲什麼我們在這裏使用C_作爲子程序名?很少有其他子程序調用的例子,我看着互聯網只是"stl",有人可以請幫我爲什麼C_stl而不是stlR調用Fortran子程序

z <- .Fortran(C_stl, x, n, 
      as.integer(period), 
      as.integer(s.window), 
      as.integer(t.window), 
      as.integer(l.window), 
      s.degree, t.degree, l.degree, 
      nsjump = as.integer(s.jump), 
      ntjump = as.integer(t.jump), 
      nljump = as.integer(l.jump), 
      ni = as.integer(inner), 
      no = as.integer(outer), 
      weights = double(n), 
      seasonal = double(n), 
      trend = double(n), 
      double((n+2*period)*5)) 
+1

子程序不叫'C_stl'。 'C_stl'是一個包含Fortran子例程名字的變量。所以如果你想調用子程序'stl',可以使用''stl「'或者設置'C_stl < - 」stl「'並使用變量'C_stl'。 – Bhas

+1

@Bhas:這是理解,但是當我查看鏈接https://svn.r-project.org/R/trunk/src/library/stats/R/stl.R中的代碼時,我看不到任何作業就像你說的那樣,但我是正面的C_Stl,從https://svn.r-project.org/R/trunk/src/library/stats/src/stl.f調用stl.f。 – kosa

+0

不知道答案,但(1)'C_stl' [只出現在這個地方的代碼庫中](https://github.com/wch/r-source/search?q=C_stl&ref=cmdform) ; (2)可能與[this]有關(https://github.com/wch/r-source/search?q=F77_SUB%28stl%29&type=Code)? –

回答

1

C_stlstats包中的一個對象,其中包含有關Fortran子例程的輔助信息。它沒有導出,所以要看到它,你必須輸入stats:::C_stl

> stats:::C_stl 
$name 
[1] "stl" 

$address 
<pointer: 0x000000000f87b950> 
attr(,"class") 
[1] "RegisteredNativeSymbol" 

$dll 
DLL name: stats 
Filename: E:/apps/R/R-3.1.1/library/stats/libs/x64/stats.dll 
Dynamic lookup: FALSE 

$numParameters 
[1] 18 

attr(,"class") 
[1] "FortranRoutine" "NativeSymbolInfo" 
+0

我不認爲這是真的。 NAMESPACE文件,正如我在第一個答案中提到的那樣,用C_stl在統計庫中的所有C/Fortran例程的名稱前綴。如果OP的.Fortran與C_stl一起工作,則不需要使用'stats ::: C_stl'。而不是語法'stats ::: C_stl'只適用於R語法的函數? – Bhas

+0

'stl'函數知道在哪裏可以找到'C_stl',因爲它們都住在'stats'包的環境中。 'C_stl'不必爲此導出。請注意,'.C' /'.Fortran'通常的第一個參數是_string_;由基本R分佈提供的函數比這個更加嚴格,並且使用分類對象。 –

+0

我更傾向於這個答案。對不起@Bhas,我知道你付出了很多努力,但這個答案似乎更正確。 – kosa

1

很多搜​​索後,我認爲我找到了答案。查看目錄<path to R sources>/src/library/stats中的NAMESPACE文件。

您將看到所有C/Fortran例程都以名稱前綴C_引用,這似乎是由useDynLib完成的。