Экспортируйте все объекты sf (dataframes) из глобальной среды из R

У меня есть куча фреймов данных SF в моей глобальной среде, я могу экспортировать их все как CSV, но вместо этого я хочу экспортировать их все как шейп-файлы.

Я попробовал вручную st_write один объект, и он работает. Теперь я хочу массово экспортировать все объекты в моем Glob Env и сохранить их как соответствующий .shp в моем рабочем каталоге. Любая помощь по массовому экспорту в шейп-файлы?

В качестве ссылки моя глобальная среда содержит около 50 элементов, поэтому невозможно экспортировать их все вручную. ;может быть, можно было бы создать список научно-фантастических фреймов данных?

Спасибо

Я пробовал сохранять как фреймы данных (list = c(is.data.frame, .globenv)), но мне абсолютно необходимо экспортировать их как shp, а не как df list.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, при этом мы не выигрываем за элегантность, но, по сути, перебираем объекты в вашей среде, обеспечивая желаемый класс и записывая их в виде 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)
  }
}

Я опасался, что вызов all не сможет должным образом распознать, но я просто попробовал гетерогенный .Global объектов и записал только == c('sf', 'data.frame') объекты в файл. Полезно решил проблему, с которой я часто сталкивался. А мой get( был гораздо более неуклюжим.

Chris 04.04.2024 15:33

Это решило мою проблему, какой убийственный ответ! большое спасибо !! :) Рад, что другим людям это тоже помогло.

Isabella Avo 04.04.2024 16:28

Я небольшой комментарий: мне показалось, что несколько проще проверить класс sf с помощью вызова inherits(), например for (object in objects) { if (inherits(get(object), "sf")) { ..., но, тем не менее, это изящный трюк с get! действительно очень полезно!

Jindra Lacko 04.04.2024 17:03

@JindraLacko: Ах да, я откуда-то помню это обсуждение... :) Не уверен, что это вообще применимо здесь, но inherits() также даст TRUE для c("sf", "tbl_df", "tbl", "data.frame") (получено через sf::read_sf()), верно? Вероятно, это зависит от того, какой уровень контроля вам здесь понадобится, но если вас не волнует, фрейм данных это или тиббл, я бы тоже выбрал inherits().

dimfalk 04.04.2024 17:56

Другие вопросы по теме