2014-07-22 144 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完成的。