我想要做的是

我正在try 编写一个使用dplyr动词的函数,该函数将"箭头打开的数据集"作为第一个参数,并将该数据集中的一列作为第二个参数.由于我希望将列作为字符串传递(对于我正在处理的实际任务的上下文来说是必需的,即Shiny),所以我使用语法.data[[.column]].下面是我收到的错误的图像和一些重现该错误的代码.任何帮助或洞察力都是值得感谢的.

错误消息的图像

enter image description here

重现错误的代码

# install.packages(c("dplyr", "ggplot2", "arrow"))
library(dplyr)

arrow::write_parquet(x = ggplot2::mpg, sink = "sample_data.parquet")

dat <- arrow::open_dataset("sample_data.parquet")

glimpse(dat)

get_metric <- function(.data, .metric) {
  
  .data %>%
    group_by(manufacturer, cyl) %>% 
    summarize(
      new_col = sum(.data[[.metric]], na.rm = T)
    ) %>% 
    ungroup() 
}

get_metric(dat, "cty") %>% collect()

其他代码可以工作,但不太使用箭头,因此速度不理想

在这段代码中,我收集的是在整齐的计算之前的东西,所以它本质上只是常规的dplyr代码.它运行,但比我在将内容提取到所述函数之前成功运行的代码慢.

get_metric2 <- function(.data, .metric) {
  
  .data %>%
    collect() %>% 
    group_by(manufacturer, cyl) %>% 
    summarize(
      new_col = sum(.data[[.metric]], na.rm = T)
    ) %>% 
    ungroup() 
}

get_metric2(dat, "cty")

推荐答案

使用!!命名法.

arrow::write_parquet(x = ggplot2::mpg, sink = "sample_data.parquet")
dat <- arrow::open_dataset("sample_data.parquet")

get_metric <- function(.data, .metric) {
  .metric <- rlang::sym(.metric)
  .data %>%
    group_by(manufacturer, cyl) %>% 
    summarize(
      new_col = sum(!!.metric, na.rm = T)
    ) %>% 
    ungroup() 
}

get_metric(dat, "cty") %>%
  collect()
# # A tibble: 32 × 3
#    manufacturer   cyl new_col
#    <chr>        <int>   <int>
#  1 audi             4     153
#  2 audi             6     148
#  3 audi             8      16
#  4 chevrolet        8     191
#  5 chevrolet        4      41
#  6 chevrolet        6      53
#  7 dodge            4      18
#  8 dodge            6     225
#  9 dodge            8     243
# 10 ford             8     197
# # ℹ 22 more rows
# # ℹ Use `print(n = ...)` to see more rows

R相关问答推荐

如何删除gggvenn与gggplot绘制的空白?

如何在R中合并和合并多个rabrame?

在组中添加值增加和减少的行

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

给定开始日期和月份(数字),如何根据R中的开始日期和月数创建日期列

如何从容器函数中提取conf并添加到ggplot2中?

用R ggplot2求上、下三角形中两个变量的矩阵热图

Data.table';S GForce-将多个函数应用于多列(带可选参数)

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

使用R中的dist()迭代ID匹配的欧几里德距离

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

如何平滑或忽略R中变量的微小变化?

WRS2包中带有bwtrim的简单ANOVA抛出错误

使用ggplot2中的sec_axis()调整次轴

创建在文本字符串中发现两个不同关键字的实例的数据框

按组跨多列创建伪变量

创建新列,其中S列的值取决于该行S值是否与其他行冗余

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

R:改进实现简单模型

如何根据顺序/序列从数据框中排除值