我写了一个Fortran子程序来计算数组的大小,我想直接在R中得到结果.但是,我没有得到预期的结果.

首先,我建立了size95.f95文件

subroutine fsize(x, n)
  double precision, intent(in):: x(:)
  integer, intent(out) :: n
  n = size(x)
end subroutine fsize

然后在Windows的CMD上编译,

R CMD SHLIB size95.f95

虽然,在我加载并测试了一个10个元素的向量在R中,我得到的长度为1而不是10.

x <- 1:10
dyn.load("size95.dll")
dotCall64::.C64("fsize",
                SIGNATURE = c("double", "integer"),
                INTENT = c("r", "w"),
 x=x, n=dotCall64::integer_dc(1))
# $x
# NULL
# 
# $n
# [1] 1

所需的输出应该是

# $x
# NULL
# 
# $n
# [1] 10

推荐答案

R itself不理解Fortran假设的形状数组(例如xfsize).在R中使用假定形状参数需要做很多工作,甚至dotCall64也不能为你做这件事.

回想一下,Fortran 77没有假设形状array.还记得在最近的Fortran中,必须告诉Fortran编译器("显式接口")当一个过程参数被假定为形状.

必须告知Fortran编译器,因为假定的形状参数(通常)使用dope vectors实现.1也就是说,传递给过程的不仅仅是数据(如1:10),而是数据和其他内容.

C与Fortran的互操作性确实允许使用假设的形状数组,它是a lot of work.你可以用R做类似的事情.然而,为了能够设置dose向量,您需要知道的一件事是输入数组的大小:在这种情况下,没有返回需要大量的工作.

现在,坚持使用标量或显式形状array.


1这个答案中链接的是英特尔数组描述符的详细信息.GCC has similar.

R相关问答推荐

如果索引重复,聚合xts核心数据

管道末端运行功能

如何从当前行上方找到符合特定条件的最接近值?

更改默认系列1以更改名称

bslib::card_header中的shine::downloadButton,图标而不是文本

在R中为马赛克图中的每个字段着色

使用列/行匹配将两个不同维度的矩阵相加

如何从像glm这样的模型中提取系数表的相关性?

R中的时间序列(Ts)函数计数不正确

如何通过ggplot2添加短轴和删除长轴?

仅在Facet_WRAP()中的相应方面包含geom_abline()

观察器中的inaliateLater的位置

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

减少雨云面之间的间距并绘制所有统计数据点

如何预测原始数据集并将值添加到原始数据集中

随机将数据帧中特定列上的某些行设置为NA

R:使用ApexCharge更改标签在饼图中的位置

重写时间间隔模糊连接以减少内存消耗

是什么打破了此Quarto仪表板中的工具提示?

随机生成样本,同时在R内的随机样本中至少包含一次所有值