R 向函数发送对象列表时如何获取对象的原始名称
假设我有以下功能:R 向函数发送对象列表时如何获取对象的原始名称,r,R,假设我有以下功能: return_name <- function(data){ for(datasets in data) print(deparse(substitute(datasets))) } my_data_1 <- data.frame(a = "a", b = "b") my_data_2 <- data.frame(a = "a", b = "b") return_name(list(my_data, my_data_2)) 问题是答案中
return_name <- function(data){
for(datasets in data)
print(deparse(substitute(datasets)))
}
my_data_1 <- data.frame(a = "a", b = "b")
my_data_2 <- data.frame(a = "a", b = "b")
return_name(list(my_data, my_data_2))
问题是答案中描述的return_name函数将返回“dataset”,而不是实际的原始对象名称 这是一种黑客行为:
return_name <- function(data){
strsplit(gsub('list|[()]', '', deparse(substitute(data))), ',\\s*')[[1]]
}
return_name(list(my_data, my_data_2))
#[1] "my_data" "my_data_2"
return_name(my_data_1)
#[1] "my_data_1"
return\u name非常感谢!这在您提供的上下文中起作用,但在我的实际代码中,我需要替换print(deparse(replacement(datasets)))
行,因为它将位于一个for循环中,该循环正在迭代列表中的所有data.frames。如果我这样做:return\u name\u 2return(name(data))
作为整个return\u name
有什么问题?或者仅仅使用names
作为开始?它不是一个命名列表,因此将返回NULL
哦,我明白了。我认为您需要的是match.call
来提取对函数的原始调用,然后您可以根据需要解析参数。就个人而言,我并不赞同这一点,因为如果在函数内部或外部定义列表,您将获得不同的功能,但每个列表都有自己的功能。当您传递数据列表时,它没有关于我的数据列表1
或我的数据列表2
的信息。你能把它列成一个名单吗<代码>数据列表=列表(my_data_1=my_data_1,my_data_2=my_data_2)
Hmm,是的,我希望有办法恢复原始名称。如果需要一个命名列表,我可以把它做成一个命名列表。最初的代码库使用未命名的列表,所以我尝试在其中工作。
return_name <- function(data){
strsplit(gsub('list|[()]', '', deparse(substitute(data))), ',\\s*')[[1]]
}
return_name(list(my_data, my_data_2))
#[1] "my_data" "my_data_2"
return_name(my_data_1)
#[1] "my_data_1"