【问题标题】:How to get the original name of a object when sending a list of objects to a function将对象列表发送到函数时如何获取对象的原始名称
【发布时间】:2020-05-26 03:53:49
【问题描述】:

假设我有以下功能:

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))

我希望这个函数能够打印my_data_1,后跟my_data_2(内存中对象的名称。

而是打印整个对象的结构。

编辑@Ronak

在我的实际代码中,我正在遍历数据框列表(不是命名列表)。我需要能够 grep 在 for 循环中的当前对象的名称上。

看起来像这样:

data_list = list(my_data_1, my_data_2)
random_function <- function(data_list){
  for(datasets in data_list)  
    value = ifelse(grepl("my_data_1", return_name(datasets)), 1, 0) 
}

问题是您的答案中描述的 return_name 函数将返回“数据集”,而不是实际的原始对象名称。

【问题讨论】:

  • return(names(data))return_name 的全部有什么问题?还是只使用names 开头?
  • 不是命名列表,所以会返回NULL
  • 哦,我明白了。我认为您想要的是 match.call 来提取对函数的原始调用,然后您可以根据需要解析参数。就个人而言,我不赞同这一点,因为如果您在函数内部或外部定义列表,您将获得不同的功能,但每个人都有自己的。
  • 当您传递data_list 时,它没有关于my_data_1my_data_2 的信息。你能把它做成一个命名列表吗? data_list = list(my_data_1 = my_data_1, my_data_2 = my_data_2)
  • 嗯,是的,我希望有办法以某种方式恢复原始名称。如果需要命名列表,我可以将其设为命名列表。原始代码库使用未命名的列表,所以我试图在其中工作。

标签: r


【解决方案1】:

这是一种黑客攻击:

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"

【讨论】:

  • 非常感谢!这在您提供的上下文中有效,但在我的实际代码中,我需要替换 print(deparse(substitute(datasets))) 行,因为它将位于迭代列表中所有 data.frames 的 for 循环中。如果我这样做:return_name_2 &lt;- function(data){ for(datasets in data) print(return_name(datasets) } 我会得到datasets 返回。有什么想法吗?
猜你喜欢
  • 2012-05-18
  • 2016-03-22
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
相关资源
最近更新 更多