R中的“double”数据的readBin问题

t5zmwmid  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(147)

我在PerkinElmer LS-50 B上使用FL winlab软件(该设备的经典Perkin Elmer供应商软件)收集3D激发-发射光谱。对于这种模式,该软件显然只允许保存 *.sp文件(来自Perkin Elmer的特定二进制文件),并且每个激励增量保存一个文件。
我想把文件读入R。我找到了一个Mathlab script here,我正在尝试做同样的事情。
第一部分看起来不错我把一个sp example file here

filename <- file.choose()

fid <- file(filename, "rb")
  
 # check if PE file
 signature <-  readBin(fid,"character",n=4L); print(signature)
  
 description <- readBin(fid, "character", n=40L)

DataSetDataMember= -29828 #this is given by Perkin Elmer

 while (!blockID==DataSetDataMember) # find out data block
      {
       blockID <- readBin(fid,'int', n=1L, size=2) # 16 bits
      } 

 innerCode <- readBin(fid,'int' ,n=1L, size=2)
  len <- readBin(fid,'int' ,n=1L, size=4)

那么如果我遵循Mathlab script,我应该做这样的事情:

df <- readBin(fid, 'double', n= len/8, size=8); head(df)

通过收集数据,我知道数据有1列和696行,并在荧光计屏幕上阅读前五行

26.551
22.92912
19.24006
15.62411
13.27673

在我当前的脚本中,我得到了正确数量的数据,但不幸的是没有得到正确的值。我得到的是这样的:

length(df)
696
head(df)
[1]  2.304505e+106 -1.515661e+170 -1.039620e-170  -2.655188e+98   2.632235e-74

我尝试了几种不同的size组合,但仍然没有得到我应该得到的。不知道问题出在哪里。

c3frrgcw

c3frrgcw1#

  • 如果 * 它们被写为64位双精度 *,那么 * 将它们读取为double将恢复它们:
> values <- sqrt(1:4)
> values
[1] 1.00000 1.41421 1.73205 2.00000
> tf <- tempfile()
> writeBin(values, tf)
> chk <- readBin(tf, "double", n=4)
> chk
[1] 1.00000 1.41421 1.73205 2.00000
> identical(chk, values)
[1] TRUE
>

在这种情况下,我的建议是用简单的手指练习来测试两种方式的流动,比如这个。

相关问题