Подтвердить что ты не робот

Как быстро преобразовать элемент размера файла file.info() из байтов в КБ, МБ, ГБ и т.д.?

Я ожидаю, что для этого уже существует ответ на stackoverflow, и я просто не смог его найти.

Желаемый результат: Быстрое преобразование элемента размера файла в вызов file.info() из байтов в КБ, МБ и т.д. Я в порядке, если на выходе будет либо i) символьная строка с нужный тип размера, например, "96 bytes" или ii) просто числовое преобразование, например, от 60963 байт до 60.963 KB (за Google).

Действия Repro:

  • Создайте папку для хранения файла:

    dir.create("census-app/data")
    
  • Загрузите файл (~ 60 КБ):

    download.file("http://shiny.rstudio.com/tutorial/lesson5/census-app/data/counties.rds",
    "census-app/data/counties.rds")
    
  • Используйте file.info()$size, чтобы вернуть размер файла в байтах:

    file.info("census-app//data//counties.rds")$size
    [1] 60963
    

Оттуда я застрял. Я понимаю, что могу сделать сложный/ручной синтаксический анализ и вычисления для преобразования (см. Преобразование килобайт, мегабайт и т.д. В байты в R).

Однако я надеюсь, что могу просто использовать базовую функцию или что-то подобное:

    format(file.info("census-app//data//counties.rds")$size, units = "KB")
    [1] "60963"
    # Attempt to return file size in KB simply returns the size in bytes
    # NOTE: format(x, units = "KB") works fine when I
    # pass it object.size() for an object loaded in R
4b9b3361

Ответ 1

Функция object.size() делает этот тип форматирования для нее, но она предназначена для указания размера объекта R, который вы передаете ему. Он не настроен на произвольное значение по значению.

Тем не менее, мы можем "украсть" некоторые из его логики форматирования. Вы можете вызвать его с помощью

utils:::format.object_size(60963, "auto")
# [1] "59.5 Kb"

Таким образом, мы можем вызвать неэкспортируемую функцию форматирования. Вы можете открыть дополнительные параметры форматирования на странице справки ?format.object_size. Обратите внимание, что он использует правило, что 1 Кбайт = 1024 байта (не 1000, как в вашем примере).

Ответ 2

Используйте функцию humanReadable() в пакете gdata. Он имеет опции для сообщения размера в базе 1000 ( "SI" ) или базовых 1024 ( "МЭК" ) единиц, а также векторизован, чтобы вы могли обрабатывать весь вектор размеров одновременно.

Например:

> humanReadable(c(60810, 124141, 124, 13412513), width=4)
[1] "60.8 kB" "124 kB"  "124 B"   "13.4 MB"
> humanReadable(c(60810, 124141, 124, 13412513), standard="IEC", width=4)
[1] "59.4 KiB" "121 KiB"  "124 B"    "12.8 MiB"

В настоящее время я работаю над подготовкой версии 2.16.0 gdata, которая добавляет возможность указать, какое устройство вы хотите использовать для сообщения размеров, а также для блоков Unix.

> humanReadable(c(60810, 124141, 124, 13412513), standard="SI", units="kB")
[1] "   60.8 kB" "  124.1 kB" "    0.1 kB" "13412.5 kB"
> humanReadable(c(60810, 124141, 124, 13412513), standard="IEC", units="KiB")
[1] "   59.4 KiB" "  121.2 KiB" "    0.1 KiB" "13098.2 KiB"
humanReadable(c(60810, 124141, 124, 13412513), standard="Unix", units="K")
[1] "   59.4 K" "  121.2 K" "    0.1 K" "13098.2 K"

-Greg [хранитель пакета gdata]

Обновление

CRAN принял версию gdata 2.16.1, которая поддерживает опции standard="Unix" и units=, и она должна быть доступна на зеркалах CRAN в ближайшее время.