Tôi đến đây với cùng một câu hỏi. Nhờ Roland cho câu trả lời của mình; Tôi xây dựng trên mã của mình với một vài thay đổi:
- Cho phép con số đáng kể được xác định khi làm tròn = FALSE (mặc định là 6 giống như 'signif' chức năng dựng sẵn)
- Không ném ra một lỗi với các giá trị dưới đây 1e-24
- đầu ra ký hiệu khoa học (không có đơn vị) cho các giá trị trên 1e27
Hy vọng điều này là hữu ích.
f2si<-function (number, rounding=F, digits=ifelse(rounding, NA, 6))
{
lut <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12, 1e-09, 1e-06,
0.001, 1, 1000, 1e+06, 1e+09, 1e+12, 1e+15, 1e+18, 1e+21,
1e+24, 1e+27)
pre <- c("y", "z", "a", "f", "p", "n", "u", "m", "", "k",
"M", "G", "T", "P", "E", "Z", "Y", NA)
ix <- findInterval(number, lut)
if (ix>0 && ix<length(lut) && lut[ix]!=1) {
if (rounding==T && !is.numeric(digits)) {
sistring <- paste(round(number/lut[ix]), pre[ix])
}
else if (rounding == T || is.numeric(digits)) {
sistring <- paste(signif(number/lut[ix], digits), pre[ix])
}
else {
sistring <- paste(number/lut[ix], pre[ix])
}
}
else {
sistring <- as.character(number)
}
return(sistring)
}
f2si(12345)
[1] "12.345 k"
f2si(12345, T)
[1] "12 k"
f2si(10^31)
[1] "1e+31" # (previous version would output "1e+07 Y"
f2si(10^-25)
[1] "1e-25" # (previous version would throw error)
f2si(123456789)
[1] "123.457 M" # (previous version would output ""123.456789 M"
f2si(123456789, digits=4)
[1] "123.5 M" # (note .456 is rounded up to .5)
Từ mã này nó khá dễ dàng để viết một chức năng tương tự cho các đơn vị tài chính thường được sử dụng (K, MM, Bn, Tr), quá.
'utils ::: print.object_size' thực hiện nó cho một số đơn vị nhị phân – James
tôi sẽ chỉ cần cẩn thận về việc này w/o hiệu đính. Ví dụ, trong khi những thứ như 3,5 Mm được cho phép bởi ISO, trong tiêu chuẩn sử dụng tất cả mọi người đi với 3,5e3 km. Vì người ta không bao giờ sử dụng tiền tố cho các giá trị không thứ nguyên, bạn định tự nối các đơn vị vật lý như thế nào? –
Tôi thấy quan điểm của bạn. Tuy nhiên những gì tôi đang làm không phải là "nghiêm trọng" và tôi không có bất kỳ đơn vị nào. Tôi chỉ hiển thị giá trị trong một cốt truyện/bảng và tôi cần tất cả để phù hợp với nó 3/4 ký tự. 10k nhỏ gọn hơn 1000 hoặc 1e + 03. – mb14