R:将列名传递给函数w / dplyr

时间:2017-08-22 19:18:01

标签: r dplyr

我正在尝试在R中设置一个函数,该函数以特定格式准备数据以输入相关图。在操作数据集时,由于其清晰度和易用性,我倾向于使用dplyr,但是在使用dplyr时,我在尝试将数据集和指定的列名称传递给此函数时遇到了问题。

这是设置,为了清楚起见,包括在这里(略微缩写形式)。我没有遇到任何错误,在发布之前我确认corrData设置正确:

library(corrplot)
library(tidyverse)
library(stringr)

table2a <- table2 %>%
    mutate(example_index = str_c(country,year, sep="."))

这是实际功能:

prepCorr <- function(dtable, x2, index2) { 

  practice <- dtable %>%
    select(index2, x2) %>%
    mutate(count=1) %>%
    complete(index2, x2)

  practice$count[is.na(practice$count)] <- 0

  practice <- spread(practice, key = x2, value = count)

  M <- cor(practice)
  return(M)
}

prepCorr(table2a, type, example_index)

每当我运行此功能时,我得到:

Error in overscope_eval_next(overscope, expr) : object 'example_index' not found

我也尝试利用quosures来解决这个问题,但是当我这样做时会收到不同的错误。当我运行以下修改过的代码时:

prepCorr <- function(dtable, x2, index2) { 
  x2 <- enquo(x2)
  index2 <- enquo(index2)

  practice <- dtable %>%
    select(!!index2, !!x2) %>%
    mutate(count=1) %>%
    complete(!!index2, !!x2)

  practice$count[is.na(practice$count)] <- 0

  practice <- spread(practice, key = !!x2, value = count)

  return(cor(practice))
}

prepCorr(table2a, type, example_index)

我明白了:

Error in !index2 : invalid argument type 

我在这里做错了什么,我该如何解决这个问题?我相信我使用dplyr 0.7进行澄清。

更新:用可重复的示例替换旧示例。

1 个答案:

答案 0 :(得分:1)

看看这个例子

library(dplyr)
myfun <- function(df, col1, col2) {
              col1 <- enquo(col1)     # need to quote
              col2 <- enquo(col2)
              df1 <- df %>%
                       select(!!col1, !!col2)   #!! unquotes
              return(df1)
         }

myfun(mtcars, cyl, gear)

您可以在此处了解link关于NSE vs SE

的更多信息