R:在函数中使用dplyr。eval(expr、envir、enclose)中出现异常:未知列

R:在函数中使用dplyr。eval(expr、envir、enclose)中出现异常:未知列,r,function,dplyr,R,Function,Dplyr,我在R中创建了一个基于@Jim M的函数 当我运行函数时,我得到一个错误:错误:未知列“rawdata” 查看调试器时,我得到一条消息:Rcpp::eval中的异常(expr、envir、enclose):未知列“rawdata” 但是,当我查看environment窗口时,我可以看到我已传递给函数的两个变量,它们包含具有7个级别因子的信息rawdata和具有28个级别的信息refdata function (refdata, rawdata) { wordlist <- expand

我在R中创建了一个基于@Jim M的函数

当我运行函数时,我得到一个错误:错误:未知列“rawdata” 查看调试器时,我得到一条消息:Rcpp::eval中的异常(expr、envir、enclose):未知列“rawdata”

但是,当我查看environment窗口时,我可以看到我已传递给函数的两个变量,它们包含具有7个级别因子的信息rawdata和具有28个级别的信息refdata

function (refdata, rawdata)
{
  wordlist <- expand.grid(rawdata = rawdata, refdata = refdata,     stringsAsFactors = FALSE)
  wordlist %>% group_by(rawdata) %>% mutate(match_score =     jarowinkler(rawdata, refdata)) %>%
summarise(match = match_score[which.max(match_score)], matched_to = ref[which.max(match_score)])
}
函数(refdata,rawdata)
{
单词列表%group\U by(rawdata)%%>%mutate(匹配分数=jarowinkler(rawdata,refdata))%%
总结(match=match_分数[which.max(match_分数)],match_to=ref[which.max(match_分数)])
}

这是使用NSE(非标准评估)的函数的问题。使用NSE的函数在交互式编程中非常有用,但在开发过程中会导致许多问题,例如,当您尝试在其他函数中使用这些函数时。由于表达式没有被直接计算,R无法在它所查找的环境中找到对象。我可以建议您阅读范围界定问题一章以了解更多信息

首先,您需要知道所有标准的
dplyr
函数都使用NSE。让我们来看看您的问题的近似示例:

数据:

让我们看看如果我把它放在一个函数中会发生什么:

lets_group <- function(column) {
  df %>% group_by(column) %>% summarise(count = n())
}

>lets_group(col1)
Error: index out of bounds 
这将产生以下结果:

#also notice the quotes around col1
> lets_group2('col1')
Source: local data frame [2 x 2]

  col1 count
1    a     5
2    b     5
我无法测试您的问题,但使用SE而不是NSE将得到您想要的结果。有关更多信息,您也可以阅读

lets_group <- function(column) {
  df %>% group_by(column) %>% summarise(count = n())
}

>lets_group(col1)
Error: index out of bounds 
#notice the formula operator (~) at the function at summarise_
lets_group2 <- function(column) {
  df %>% group_by_(column) %>% summarise_(count = ~n())
}
#also notice the quotes around col1
> lets_group2('col1')
Source: local data frame [2 x 2]

  col1 count
1    a     5
2    b     5