将整洁的选择参数转换为字符向量

问题描述

我正在努力将整齐的选择样式函数参数转换为字符向量。

f <- function(d,cols1,cols2) {
  <do something useful with d>
  <some magic>
}
f(iris,c(Sepal.Length,Species),Petal.Width)
# [1] "Sepal.Length" "Species" "Petal.Width"

这是一个激励人的例子。

比方说,我有一个函数可以创建两个data.frame并将它们连接在一起。 data.frame中的一个计算时间很长,因此我想提供一个提供预先计算的data.frame的选项。

我在这里使用拥抱来进行整洁的评估。看一个最小的例子:

my_func <- function(df,cols2,df2=NULL) {
  df1 <- df %>%
    do_something(across({{cols1}})

  if (!is.null(df2) {
    # 1. here I would like to check column names of df2
  } else {
    df2 <- df %>%
      do_something_very_slow(across({{cols2}})
  }

  # 2. here I would like to provide by=c(cols1,cols2)
  full_join(df1,df2)
}

# I am using tidy select to pass column names to the function.
result <- my_func(df,c(a,b),c)

现在,我想对这段代码进行两项改进。

  1. 在#1中,我想验证precomputed_df是否具有它需要的所有列(即:a,b和c)。直接的方法是将c(col1,col2)转换为字符向量。但这当然会导致错误。我看到的其他替代方法是尝试将select()tryCatch()一起使用,但这看起来很丑。
  2. 在#2中,full_join()将通过一条消息“由XXX列加入”。避免这种情况的唯一方法是提供列名by=c('a','b','c')的显式字符向量。但是为此,我再次需要一个字符向量。丑陋的解决方法将是intersect(names(df1),names(df2))suppressMessages()。当您确定df1和df2中没有多余的列时,这可能会起作用。另一个相当丑陋的方法是使用names(select(df1,c({{cols1}},{{cols2}}))

是否有更优雅的方法将cols1cols2转换为字符向量?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)