【发布时间】:2020-12-11 08:33:03
【问题描述】:
对于我的学士论文,我想使用带有直方图的 R 以十六进制格式(48 位)显示内存地址。
十六进制值存储在 csv 文件中:
$ cat addresses.csv | head -n 4
local variable,static variable,dynamically allocated variable,base (main),printf (library)
0x7ffcfa7c8694,0x55c109737010,0x55c10a70fe80,0x55c1095348fa,0x7f7099a39f00
0x7ffc17929914,0x5572286a9010,0x5572287fde80,0x5572284a68fa,0x7f8308f18f00
0x7ffdd75d11a4,0x55f6a7eff010,0x55f6a8e6de80,0x55f6a7cfc8fa,0x7fbc7d08bf00
所以我将地址绘制如下:
> data = read.csv("addresses.csv")
> str(data)
'data.frame': 203540 obs. of 5 variables:
$ local.variable : num 1.41e+14 1.41e+14 1.41e+14 1.41e+14 1.41e+14 ...
$ static.variable : num 9.43e+13 9.39e+13 9.45e+13 9.41e+13 9.39e+13 ...
...
> hist(local.variable)
结果:
您可能已经注意到,十六进制值被隐式转换为十进制。那不是我想要的。
如何用十六进制值绘制直方图?
我之前的做法:
> data = read.csv("addresses.csv", colClasses = "character")
> str (data)
'data.frame': 203540 obs. of 5 variables:
$ local.variable : chr "0x7ffcfa7c8694" "0x7ffc17929914" "0x7ffdd75d11a4" "0x7ffee91b85e4" ...
$ static.variable : chr "0x55c109737010" "0x5572286a9010" "0x55f6a7eff010" "0x5592c9774010" ...
...
> hist(local.variable)
Error in hist.default(data$local.variable) : 'x' must be numeric
我期待您的想法和复杂的解决方法。谢谢。
编辑:按照要求的可重现格式的样本数据:
> data = read.csv("sample.csv")
> dput(data)
structure(list(local.variable = c(140724510951060, 140720703969556,
140728216654244), static.variable = c(94287575609360, 93948792705040,
94517867835408), dynamically.allocated.variable = c(94287592226432,
93948794101376, 94517884018304), base..main. = c(94287573502202,
93948790597882, 94517865728250), printf..library. = c(140121590701824,
140200767491840, 140447528304384)), .Names = c("local.variable",
"static.variable", "dynamically.allocated.variable", "base..main.",
"printf..library."), class = "data.frame", row.names = c(NA,
-3L))
> data = read.csv("sample.csv", colClasses = "character")
> dput(data)
structure(list(local.variable = c("0x7ffcfa7c8694", "0x7ffc17929914",
"0x7ffdd75d11a4"), static.variable = c("0x55c109737010", "0x5572286a9010",
"0x55f6a7eff010"), dynamically.allocated.variable = c("0x55c10a70fe80",
"0x5572287fde80", "0x55f6a8e6de80"), base..main. = c("0x55c1095348fa",
"0x5572284a68fa", "0x55f6a7cfc8fa"), printf..library. = c("0x7f7099a39f00",
"0x7f8308f18f00", "0x7fbc7d08bf00")), .Names = c("local.variable",
"static.variable", "dynamically.allocated.variable", "base..main.",
"printf..library."), class = "data.frame", row.names = c(NA,
-3L))
【问题讨论】:
-
您是否可以接受精度损失?如果您以数字形式读取值,它们将被转换为浮点数。如果没有,您将需要以字符形式读取数据并以其他方式解析它。在这种情况下,
dput()的字符值会更好。 -
随机样本表明隐式转换的数据类型 numeric (double) 的当前精度是足够的。它可能是 52 位,我有 48 位。因此,将值解析为数字并使用十六进制标签绘制它们就足够了。