一位同事将数千个S函数和Fortran子例程移植到R.本机R函数包含在5个.RData文件中,Fortran子例程包含在2个.dll文件中。
为了使我的文档更具可移植性,这些文件已上传到Blackboard并使用
加载到R中---
title: "dyn.load and Shiny"
subtitle: "Why can't we all just get along?"
author: "Jason Freels"
output:
ioslides_presentation:
widescreen: true
runtime: shiny
---
```{r echo=FALSE,message=FALSE}
setInternet2(TRUE)
download.file("http://afit.blackboard.com/bbcswebdav/users/jfreels/DFORRT.dll",
paste(c(getwd(),"/DFORRT.dll"), collapse=""),
method="internal",mode="ab")
dyn.load("DFORRT.dll")
download.file("http://afit.blackboard.com/bbcswebdav/users/jfreels/SPLIDA.dll",
paste(c(getwd(),"/SPLIDA.dll"), collapse=""),
method="internal",mode="ab")
dyn.load("SPLIDA.dll")
a<-url("https://afit.blackboard.com/bbcswebdav/users/jfreels/echapters.RData" ); load(a)
b<-url("https://afit.blackboard.com/bbcswebdav/users/jfreels/RSplida Codes.RData"); load(b)
c<-url("https://afit.blackboard.com/bbcswebdav/users/jfreels/RSplidaData.RData" ); load(c)
d<-url("https://afit.blackboard.com/bbcswebdav/users/jfreels/RSplidaUser.RData" ); load(d)
e<-url("https://afit.blackboard.com/bbcswebdav/users/jfreels/Text data.RData" ); load(e)
```
此代码适用于pdf_document,html_document和ioslides_presentation参数,当我添加runtime: shiny
时,我可以在RStudio查看器中成功生成演示文稿的预览。但是,当我尝试将演示文稿部署到shinyapps.io时,出现错误:“无法找到函数setInternet2”
以前,我尝试使用
在本地加载.dll文件for (i in 1:2){ dyn.load(list.files(getwd())[grep("dll",strsplit(list.files(getwd()),"\\W+"))][i]) }
使用这种方法,我也可以在RStudio中成功生成预览,但是当我尝试部署演示文稿时,我得到一个不同的错误,说加载共享库的尝试导致“无效的ELF标题”。
闪亮(或shinyapps.io)和.dll文件之间是否存在冲突?
提前致谢,
杰森
答案 0 :(得分:0)
也许在文档中并不清楚,但ShinyApps.io使用Linux实例(Ubuntu),所以你肯定无法在那里加载.dll文件(仅限Windows)。最自然和最便携的解决方案是使其成为R包,将其放在Github上,使用devtools::install_github()
进行安装,然后将应用程序部署到ShinyApps.io。然后将在Linux上重新安装和编译软件包,您无需关心Fortran代码是.dll
还是.so
或其他什么。
如果你真的不愿意制作一个R包(实际上很容易做到并且有很大的好处),你当然可以调用R CMD SHLIB
来编译你的Fortran代码,但你不应该硬编码扩展名为.dll
。根据您的平台,可能会有所不同:请改用.Platform$dynlib.ext
。