在R语言中提取列表内sf对象名称的技术问题
解决方案:提取列表中sf对象的原变量名
问题根源
你创建列表时没有为元素指定名称,所以names(object_list)返回NULL。直接把变量塞进列表时,R不会自动保留原变量名作为列表元素的名称,需要手动指定。
最优解决方法:创建列表时直接命名
这是最直接可靠的方式,创建列表时为每个元素赋予对应的原变量名,后续直接通过names()提取即可:
# 创建带名称的列表 object_list <- list( subte_estaciones = subte_estaciones, trenes = trenes, Universidades = Universidades ) # 提取名称向量 object_names <- names(object_list) # 输出结果:[1] "subte_estaciones" "trenes" "Universidades"
为什么你的循环方法失败?
- 第一个循环中,
deparse(substitute(object_list[[i]]))无法获取原变量名,因为此时object_list[[i]]是列表中的元素值,substitute()捕获的是索引表达式而非原变量名,得到的是类似"object_list[[1]]"的字符串,拼接后不符合需求。 - 第二个循环只是生成了自定义的序列名称,并非你需要的原对象名。
备选方法:回溯已存在的无命名列表(有局限)
如果已经创建了无命名列表,且全局环境中没有重复内容的sf对象,可以通过匹配对象内容来回溯名称:
# 获取全局环境中所有sf类型的对象名称 sf_obj_names <- Filter(function(x) inherits(get(x), "sf"), ls(.GlobalEnv)) # 匹配列表元素与环境中的对象,得到对应名称 object_names <- sapply(object_list, function(obj) { sf_obj_names[sapply(sf_obj_names, function(x) identical(get(x), obj))] })
注意:如果环境中有多个内容完全相同的sf对象,这种方法会匹配错误,所以优先推荐第一种创建带名称列表的方式。
内容的提问来源于stack exchange,提问作者Sixto Cristiani
相关产品推荐
相关产品推荐

