用R语言调用Fortran子程序

首先写这篇博客的原因是因为关于R调用Fortran之前摸索了两天,然后没弄通就放弃了,后来因为课题需求不得不用R调用大牛写的Fortran程序(毕竟自己写不出来),所以只能硬着头皮去调通程序,然后各种搜索资料,苦苦琢磨了两三天,最后终于在用is.loaded看是否导入成功的时候,看到了我期待已久的TRUE了,此时我的心率可以说比我跑完5公里之后的心率还要快,激动的我晚上直接奖励了自己一个大鸡腿,简直是高兴得不得了(恕我要求低,碰到这么点成就就差点喜极而泣)。

回到正题,首先需要说明,你必须跟着我做好每一步,一步都不能漏,等自己搞通了之后再考虑通过其路径,我给的方法是最直接最笨的方法(很适合没有一点计算机基础的同学,特别是看到dos窗口都觉得很神奇的同学)

1.首先毋庸置疑的是你需要安装R(当然加装Rstudio肯定更好用)和Fortran(我是在六维空间下载的,装的是Fortran6.5简版)

2.然后不要问我为什么,直接去官网下载Rtools(你可以不下,很抱歉,我只会这个方法,前提是你不用我写的方法),网址是https://cran.r-project.org/bin/windows/Rtools/,然后选择一个版本下载(我下载的版本是Rtools33.exe)。安装的时候尽量安装在C盘吧,当然我装的是D盘。重要的事情来了,你装的时候会有提示要不要修改环境变量path,这个请一定要勾选,然后就会自动把Rtools路径添加到path变量了。不过忘记勾选的朋友也不要惊慌,跟着我来修改一遍:找到计算机,然后右键进入属性,然后高级系统设置,单击高级里面的环境变量,点开之后下面的系统变量中找到path变量,单击编辑选项,在后面加上 ;C:\Rtools\bin;C:\Rtools\gcc-4.6.3\bin;  注意:我帮你把分号都写好了,你如果装在D盘就把C换成D就行了。

3.前面两步一定要全部做好了,才能进行接下来我要介绍的步骤,否则会出现命令无效或者命令不存在等等让你焦虑的错误,不要问我怎么改或者怎么办,返回去按照我说的再做一遍吧,再次声明:我只会这样做(怪我太笨)。接下来这个步骤是给那些可能都不知道Fortran怎么用的同学。先打开Fortran,点击file按钮然后new,然后选择Fortran Dynamic Link Library,给个项目名称multiply(这里采用的例子是来自网址https://en.wikiversity.org/wiki/R_(programming_language)/Tutorials/Connecting_Fortran_and_R),然后点击ok键,会弹出一个窗口,选项有两个(第一个说是创建空白库,第二个是会自动写入空函数,具体英文我就不写了,直接选择第二个就行了),我们选择第二个(免得又要自己去创建函数,省去这个步骤),然后finish就行了。创建完之后呢我们可以在multiply files中的source files下看到multiply.f90这个函数,双击进入函数,将给你的网址例子中的代码复制进去并编译执行(这个按钮就不用我教了吧,用过C的人都知道在哪里),执行完之后一定确保不报错才行哈。

4.前面三步很关键,没完成或者报错的同学就不要继续了,返回去好好改改,看看哪步忘记了。完成第三步之后我们就找到multiply这个文件夹(在你安装的Fortran6.5文件夹下),然后复制其中的文件multiply.f90,把它放在C:\Rtools\gcc-4.6.3\bin目录下。好了,到这里,你该做的准备工作就结束了,这是非常重要的,不要漏掉每个细节,不然没法继续下一步了。

5.此时就可以利用Rtools的gfortran工具了,具体操作是这样的,先打开DOS窗口(方法是:运行(快捷键是Windows键+R)->cmd),这个应该不用我教的,相信大家都会。然后在DOS里面执行下列代码:
c:  #设置路径到c盘下,如果装在D盘上就写d:
cd Rtools\gcc-4.6.3\bin  #相当于将目录更改到C:\Rtools\gcc-4.6.3\bin中
gfortran -shared -o multiply.dll multiply.f90  #执行完之后呢不能报错,否则就不会在bin目录下生成multiply.dll文件

6.完成第五步之后几乎该做的工作都做完了,剩下的就是R的事情了,R中的代码如下:
dyn.load("C:/Rtools/gcc-4.6.3/bin/multiply.dll") #加载动态库
is.loaded("multiply") #看是否导进来了,得到TRUE才说明加载成功
a=5
b=2
.Fortran("multiply",as.integer(a),as.integer(b),c=integer(1)) #调用mutiply函数

到这里你就漂亮的完成一次R调用Fortran了,我用了最简单最笨的的办法来进行的,应该都能看得懂。你应该庆祝下自己完成了如此漂亮的突破,但是这貌似只是刚起步,因为还有一件很棘手的事情需要你处理,那就是修改Fortran代码,改成R能调用的形式(给的这个例子未免过于简单了,因为就做了一个乘法),这就需要你稍微了解Fortran的语法和数据结构了。首先声明一下,R只能调用Fortran中的子程序(即subroutine,相当于R中的function),也不要问我为什么,别人是这么设计的我也无法回答(毕竟不是我写的,否则我就不会这么费事了)。这里我觉得我不用说太多,因为不会Fortran的我说了也是白说,会Fortran的看了我接下来的提醒就会知道怎么去修改程序了。

首先对于那些函数互相调用,出现一堆common的程序我相信很多人头都大了,这个你不用想太多,只要保证你想调用的主程序里面必须也有同样common,而且common中的变量确实存在(不存在的话就需要通过参数输入了)。然后呢就是变量的维数要做到R和Fortran中的保持一致,毕竟Fortran所有变量都需要指定类型(向量就要设置维数),所以你要把R中输入到Fortran中的参数事先维数统一。其他的就没啥问题了,前提是你的Fortran程序是正确的。

最后呢在这里要感谢在网上分享心得的热心网友,虽然我都不知道自己在哪看到的具体方法,但是希望看到我写的这篇博客的朋友在学习中有什么好的收获麻烦花点时间分享出来,互相学习才能更快的进步。



  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值