下面我有一个关于我想要函数做什么的工作示例,然后是该函数的脚本,注意错误发生的位置。
错误消息是:
Error: index out of bounds
我所知道的通常意味着R无法找到被调用的变量。
有趣的是,在我下面的函数示例中,如果我只按subgroup_name
分组(传递给函数并成为新创建的数据框中的列),该函数将成功重新组合该变量,但我也是想要按新创建的列(来自融合)分组调用变量。
类似的代码曾经使用regroup()
为我工作,但已被弃用。我试图使用group_by_()
,但无济于事。
我已阅读了许多其他帖子和答案,并在今天进行了几个小时的实验,但仍未成功。
# Initialize example dataset
database <- ggplot2::diamonds
database$diamond <- row.names(diamonds) # needed for melting
subgroup_name <- "cut" # can replace with "color" or "clarity"
subgroup_column <- 2 # can replace with 3 for color, 4 for clarity
# This works, although it would be preferable not to need separate variables for subgroup_name and subgroup_column number
df <- database %>%
select(diamond, subgroup_column, x,y,z) %>%
melt(id.vars=c("diamond", subgroup_name)) %>%
group_by(cut, variable) %>%
summarise(value = round(mean(value, na.rm = TRUE),2))
# This does not work, I am expecting the same output as above
subgroup_analysis <- function(database,...){
df <- database %>%
select(diamond, subgroup_column, x,y,z) %>%
melt(id.vars=c("diamond", subgroup_name)) %>%
group_by_(subgroup_name, variable) %>% # problem appears to be with finding "variable"
summarise(value = round(mean(value, na.rm = TRUE),2))
print(df)
}
subgroup_analysis(database, subgroup_column, subgroup_name)
答案 0 :(得分:5)
来自NSE vignette:
如果您还想输出变量,则需要传递一个列表 引用的对象到.dots参数:
此处,应引用variable
:
subgroup_analysis <- function(database,...){
df <- database %>%
select(diamond, subgroup_column, x,y,z) %>%
melt(id.vars=c("diamond", subgroup_name)) %>%
group_by_(subgroup_name, quote(variable)) %>%
summarise(value = round(mean(value, na.rm = TRUE),2))
print(df)
}
subgroup_analysis(database, subgroup_column, subgroup_name)
正如@RichardScriven所提到的,如果您打算将结果分配给新变量,那么您可能希望最后删除print
调用,只需编写df
,或者甚至不分配函数中的df
否则,即使您执行x <- subgroup_analysis(...)