用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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、