【发布时间】:2020-02-20 02:24:57
【问题描述】:
我可以创建一个将对象名称作为参数的函数(这只是一个普通函数)。
我现在还可以创建一个函数,通过命名向量(使用 dataset <- eval(sym(dataset)) 和 date_col <- sym(date_col))获取其数据和列参数。
但是我想要一个可以处理这两种类型的输入的函数。
第一步是检测输入的类别。
对于数据集参数,这(下)适用于命名向量和实际对象名称。
if (is.character(dataset)) {
dataset <- eval(sym(dataset)) }
但是,我无法找出处理列参数的适当方法。
当我为它们使用命名向量元素时,该过程(如下)运行良好。
if (is.character(date_col)) {
date_col <- sym(date_col) }
但我不确定如何处理实际的列名(即通过在上面添加else 组件)。
本质上我想把它变成一个符号,所以我仍然可以在函数的步骤中使用 {{}}(或 !!)。
这是我所追求的最小可复制示例。 如您所见,命名矢量版本有效,但实际数据集和列名无效。
我所追求的可能吗?一个函数可以以这种方式动态化还是我需要创建两个单独的函数?
[已编辑:根据评论做了一个更简单的例子]
library(dplyr)
library(rlang)
new_table <- tibble(
Date = seq.Date(as.Date("2016-01-01"), as.Date("2019-12-31"), 1)) %>%
mutate(total_sales = rnorm(n()))
f_arguments <- c("dataset" = "new_table",
"date_col" = "Date",
"sales_col" = "total_sales")
f <- function(data, x, envir = parent.frame()) {
if (is.character(data)) {
data <- get(data, envir)}
if (is.character(x)) {
x <- sym(x) }
data %>%
mutate(year_month = lubridate::floor_date(!!ensym(x), "months"),
year = lubridate::year(!!ensym(x)))
}
# this (below) works per the above code, but not if I comment out
# the if (is.character(x)) line
f(f_arguments[["dataset"]],
f_arguments[["date_col"]])
# this (below) does not work with the above code, but it will work if I comment out
# the if (is.character(x)) line
f(new_table, Date)
【问题讨论】:
-
ps,已阅读 stackoverflow.com/questions/57376099/… 并且以我为例,他们的解决方案似乎都不起作用
-
问题应该按照r标签页顶部的说明有minimal示例。上面有很多与问题无关的代码。
-
已更新以获得更简单的最小示例