【问题标题】:Fortran style formatting in R?R中的Fortran样式格式?
【发布时间】:2021-03-22 16:12:14
【问题描述】:

我有一个不同值的列表,我需要在 Fortran90 代码中以特定方式对其进行格式化。

F90 文件按以下格式读入输入文件:

'5E16.8'

意思是 5 列,用科学记数法表示,总列宽为 16 位,小数点后 8 位。

此类输入文件的典型行如下所示:

-8.68914773E-03 -5.94151619E-03 2.34059840E-04 -2.76737270E-03 -4.90334584E-03

请注意,负号占总宽度的额外空间,值的长度固定在小数位数上。

我将如何从 R 中这样的列表/矩阵中格式化我的字符串和值?

一个示例矩阵:

m <- matrix(c(1, 2, 3, -1, -2, -3, 0.5, 3.9, -40, 120))

上面提到的格式看起来像:

  1.00000000E+00  2.00000000E+00  3.00000000E+00 -1.00000000E+00 -2.00000000E+00
 -3.00000000E+00  0.50000000E+00  3.90000000E+00 -4.00000000E+01  1.20000000E+02

【问题讨论】:

  • 不知道,但你有没有仔细阅读?sprintf...?
  • 到目前为止,我已经看过 cat/sprintf/write,但没有运气。问题通常在于将负号添加为额外的字符导致间距混乱
  • sprintf("%16.8e",m) 加上一些gsub() 工作将e+ 转换为E
  • (1) 你的第三列有E0 而不是E00,这是故意的吗? (2) 大小
  • 我的例子看起来像你的 except 0.5 (呈现为5.00000...e-01 ...)

标签: r format


【解决方案1】:

这似乎非常接近:

(ss <- toupper(sprintf("%16.8e",m)))
 [1] "  1.00000000E+00" "  2.00000000E+00" "  3.00000000E+00" " -1.00000000E+00"
 [5] " -2.00000000E+00" " -3.00000000E+00" "  5.00000000E-01" "  3.90000000E+00"
 [9] " -4.00000000E+01" "  1.20000000E+02"

元素 7 不同,5.0...E-01 而不是 0.5...E+00

然后转换为5列矩阵:

cat(apply(matrix(ss,ncol=5,byrow=TRUE),1,paste,collapse=""),sep="\n")
  1.00000000E+00  2.00000000E+00  3.00000000E+00 -1.00000000E+00 -2.00000000E+00
 -3.00000000E+00  5.00000000E-01  3.90000000E+00 -4.00000000E+01  1.20000000E+02

【讨论】:

  • .1e-101 这样的值的打印方式有所不同?在带有E16.8 的 Fortran 中,我们期望像 0.10000000-100 这样的东西,我怀疑如果不付出更多努力,在这个 R 中不会发生这种情况。
  • 有趣。我很确定sprintf 将通过 C 库进行定义,所以这将是 C/Fortran(而不是 R/Fortran)的区别......?我在sprintf 中没有看到任何看起来有用的东西(认为# 可能会这样做,但显然不会)。 C/Fortran 的东西可能会引起更广泛的受众(即比 R 程序员更广泛......)
  • 感谢 Ben 的帮助,它工作得很好 :) 我的值进入最大 -10 负指数,所以我不需要担心
猜你喜欢
  • 2021-12-13
  • 2012-09-03
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
相关资源
最近更新 更多