问题描述
对于我的学士论文,我想使用带直方图的R以十六进制格式(48位)显示内存地址。
$ 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")),-3L))
解决方法
您可以获取R用于绘图的基数10个中断,然后在这些位置绘图十六进制标签。例如:
# Fake data
set.seed(2)
x=as.hexmode(sample(1:1e9,10000))
p = hist(x,xaxt="n")
现在,如果您在控制台中输入p
,您会看到它是一个包含多个元素的列表。其中之一称为breaks
,其中包含直方图中断值的向量。我们可以使用它来创建十六进制标签并将其添加到绘图中。
labs = as.hexmode(p$breaks)
axis(side=1,at=p$breaks,labels=labs)
以10为基数的中断通常不会以16为基数。如果要将中断设置为以16为基数,可以执行以下操作:
# Generate nice breaks in hexadecimal
brks = seq(as.hexmode(0),as.hexmode(round(1.01*max(x))),by=as.hexmode("4000000"))
p = hist(x,xaxt="n",breaks=brks)
axis(side=1,at=brks,labels=as.hexmode(brks))