【问题标题】:Function in R: Use list argument as character string [duplicate]R中的函数:使用列表参数作为字符串[重复]
【发布时间】:2018-01-01 15:52:23
【问题描述】:

我正在编写一个使用列表参数的函数。在此函数中,我使用stack() 将列表转换为数据框。现在,我的问题是,如何用我在函数参数中使用的列表的名称重命名结果数据框的列(或任何其他数据框,如实际函数所需要的)?

我的功能:

stack_and_rename <- function(list) {

stacked_list <- stack(list)
names(stacked_list)[names(stacked_list)=='ind'] <- 'list' 
stacked_list

}

一个虚拟列表:

fields <- list(A = c(2:4, 12:16, 24:28, 36:40, 48:49), 
           B = c(6:10, 18:22, 30:34, 42:46))

但是打电话给stack_and_rename(fields) 显然返回一个包含“值”和“列表”列的数据框,尽管我想获得“值”和“字段”。我一定是在犯一些引用错误,但我无法得到解决方案。谢谢!

【问题讨论】:

  • 这真的只是the wide-to-long question,例如library(tidyr); fields %&gt;% as.data.frame() %&gt;% gather(fields)
  • @alistaire :我很抱歉,但我看不出从宽到长的问题与我的问题有什么关系。你能解释一下吗?

标签: r function arguments


【解决方案1】:

我们可以从base R使用deparse(substitute

stack_and_rename <- function(list) {
  nm1 <- deparse(substitute(list))
  stacked_list <- stack(list)
  names(stacked_list)[names(stacked_list)=='ind'] <- nm1
  stacked_list

}

stack_and_rename(fields)

或者dplyr

library(dplyr)
stack_and_rename <- function(list) {
   nm1 <- quo_name(enquo(list))
   stacked_list <- stack(list)
   stacked_list %>%
       rename_at(vars('ind'), funs(paste0(nm1)))
       #or
       #rename(!! nm1 := ind)


}


stack_and_rename(fields) %>% 
          names
#[1] "values" "fields"

【讨论】: