У меня есть куча фреймов данных SF в моей глобальной среде, я могу экспортировать их все как CSV, но вместо этого я хочу экспортировать их все как шейп-файлы.
Я попробовал вручную st_write один объект, и он работает. Теперь я хочу массово экспортировать все объекты в моем Glob Env и сохранить их как соответствующий .shp в моем рабочем каталоге. Любая помощь по массовому экспорту в шейп-файлы?
В качестве ссылки моя глобальная среда содержит около 50 элементов, поэтому невозможно экспортировать их все вручную. ;может быть, можно было бы создать список научно-фантастических фреймов данных?
Спасибо
Я пробовал сохранять как фреймы данных (list = c(is.data.frame, .globenv)), но мне абсолютно необходимо экспортировать их как shp, а не как df list.
Вероятно, при этом мы не выигрываем за элегантность, но, по сути, перебираем объекты в вашей среде, обеспечивая желаемый класс и записывая их в виде shp на диск с использованием имени объекта, похоже, помогает:
objs <- ls()
for (obj in objs) {
if (all(class(get(obj)) == c("sf", "data.frame"))) {
fname <- paste0(obj, ".shp")
sf::st_write(get(obj), fname)
}
}
Это решило мою проблему, какой убийственный ответ! большое спасибо !! :) Рад, что другим людям это тоже помогло.
Я небольшой комментарий: мне показалось, что несколько проще проверить класс sf с помощью вызова inherits()
, например for (object in objects) { if (inherits(get(object), "sf")) { ...
, но, тем не менее, это изящный трюк с get! действительно очень полезно!
@JindraLacko: Ах да, я откуда-то помню это обсуждение... :) Не уверен, что это вообще применимо здесь, но inherits()
также даст TRUE
для c("sf", "tbl_df", "tbl", "data.frame")
(получено через sf::read_sf()
), верно? Вероятно, это зависит от того, какой уровень контроля вам здесь понадобится, но если вас не волнует, фрейм данных это или тиббл, я бы тоже выбрал inherits()
.
Я опасался, что вызов
all
не сможет должным образом распознать, но я просто попробовал гетерогенный .Global объектов и записал только== c('sf', 'data.frame')
объекты в файл. Полезно решил проблему, с которой я часто сталкивался. А мойget(
был гораздо более неуклюжим.