用R语言调用Fortran子程序

2024-04-22 10:38

本文主要是介绍用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程序是正确的。

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



这篇关于用R语言调用Fortran子程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925562

相关文章

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点