- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ):
我有这个功能:
date_from_text <- function(df, x){
x <- rlang::enquo(x)
name <- rlang::quo_name(x)
df %>%
dplyr::mutate(!!name := lubridate::ymd_hms(!!x))
}
当日期时间列具有正确的类时,我将使用它来提取所有组件。
date_columns <- function(df, x){
x <- rlang::enquo(x)
df %>%
dplyr::mutate(year=lubridate::year(!!x),
ydag=lubridate::yday(!!x),
weekday=lubridate::wday(!!x, label=FALSE),
hour = lubridate::hour(!!x),
hour_min= hms::as.hms(lubridate::force_tz(!!x)),
week_num = lubridate::week(!!x),
month = lubridate::month(!!x),
date = lubridate::date(!!x))
}
我不想将 date_from_text
函数包含在 NAMESPACE
中,我想以某种方式将它包含在 date_columns
函数中。比如检查时间戳是否有正确的类,如果没有则更改类......然后创建所有日期时间组件。
我不知道如何在另一个函数中调用第一个函数。
测试数据:
df <- structure(list(time = c("2018-01-30 20:08:18", "2018-02-01 21:01:25",
"2018-01-31 23:25:12", "2018-01-28 23:45:34", "2018-01-31 12:00:55",
"2018-02-04 09:15:31", "2018-01-27 21:08:02", "2018-02-08 01:50:31",
"2018-02-01 03:15:43", "2018-02-04 01:04:52"), type = c("A",
"D", "B", "B", "B", "D", "C", "C", "C", "A")), .Names = c("time",
"type"), row.names = c(NA, -10L), class = c("tbl_df", "tbl",
"data.frame"))
更新:所以我现在将 date_from_text
包含在 date_columns
date_columns <- function(df, x){
x <- rlang::enquo(x)
out <- df %>%
date_from_text(!!x) %>%
dplyr::mutate(year=lubridate::year(!!x),
ydag=lubridate::yday(!!x),
weekday=lubridate::wday(!!x, label=FALSE),
hour = lubridate::hour(!!x),
hour_min= hms::as.hms(lubridate::force_tz(!!x)),
week_num = lubridate::week(!!x),
month = lubridate::month(!!x),
date = lubridate::date(!!x))
out
}
所以我不明白为什么我必须在 date_columns
中再次使用 !!x
?它已经包含在 date_from_text
中。我正在调用函数而不是创建它...
最佳答案
正如在评论和聊天中所讨论的那样,问题既不是关于包开发和命名空间,也不是关于管道。问题是如何使用 tidyeval在可能嵌套的包装函数中。
答案是用户传递给函数的表达式需要是 quoted and unquoted , 就像在 date_from_text()
中一样下面通过 enquo(x)
和 !!x
.
date_from_text <- function(df, x) {
x <- rlang::enquo(x) # quote via enquo()
name <- rlang::quo_name(x)
dplyr::mutate(df, !!name := lubridate::ymd_hms(!!x)) # unquote via !!
}
然后,可以将表达式以“交互”模式传递给此类函数,就像 dplyr 函数一样:
date_from_text(df, time)
select(df, time)
请记住,函数内的函数不采用表达式,而是带引号和不带引号的表达式,就像在 mutate()
中一样用 enquo(x)
打电话和 !!x
以上。
这意味着,在 date_from_text()
中下面,两个电话date_from_text()
和 mutate()
需要领取!!x
.
date_columns <- function(df, x) {
x <- rlang::enquo(x)
out <- date_from_text(df, !!x)
out <- dplyr::mutate(out, year = lubridate::year(!!x))
return(out)
}
除此之外,在包开发中,您可以使用所有函数,无论它们是exported。或不(就像我在 date_from_text()
中对 date_columns()
所做的那样)。导出的函数需要记录在案,安装后可以通过library(pkg)
使用或 pkg::fun()
, 而未导出的功能只能在通过 pkg:::fun()
安装后使用.
我修改了@David 的函数以专注于相关部分。
关于r - Tidyeval in own functions in own functions inside own functions with the pipe 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55899506/
假设我有两个函数,我想将 a 嵌套在 b 中: library(dplyr) library(rlang) a % head() Sepal.Length Sepal.Width Petal.Le
我想使用 dplyr >= 0.7 删除列向量 library(dplyr) data(mtcars) rem_cols % select(-one_of(rem_cols)) 关于以
我正在尝试创建一个将列名称列表传递给 dplyr 函数的函数。如果列名称列表以 ... 形式给出,我知道如何执行此操作,如 tidyeval 文档中所述: df % group_by(!!!g
我正在尝试创建一个将列名称列表传递给 dplyr 函数的函数。如果列名称列表以 ... 形式给出,我知道如何执行此操作,如 tidyeval 文档中所述: df % group_by(!!!g
我有一个 tibble 列 foo 包含 tibble 中另一列的名称。我想根据 foo 中命名的列进行过滤: mtcars %>% mutate(foo = c(rep("carb", 16),
我在 R 中有一个简单的函数,... 使用 tidyeval。是否可以将这些更改为字符串? simple_paste % paste(collapse="_x_") } si
如果我想明确覆盖范围,我可以使用 .data像这样的代词 library(dplyr) cyl # A tibble: 32 x 1 #> cyl_plus_one #>
我正在尝试包装 dplyr::filter在一个函数中,当有多个时 filter条件,然后它们作为向量或列表传递。请参阅此最小示例: filter_wrap 5) obtained 5) stop
与Tidy evaluation programming with dplyr::case_when有些相关和 Making tidyeval function inside case_when ,我
我正在使用 tidyeval 编写一个简单的函数,我需要将参数传递给公式接口(interface)。虽然我已经设法构建了该函数的工作版本,但它似乎不适用于 for 循环。 函数 foo Bayes
我正在尝试使用 tidyeval 进行编程。 我想编写一个函数来为选定的结果变量运行逻辑回归模型: library(tidyverse) set.seed(1234) df 如果我们还需要使用tid
考虑这个简单的例子 library(dplyr) dataframe dataframe # A tibble: 4 x 3 id group value 1 1
最新版本的 dplyr 不推荐使用下划线版本的函数,例如 filter_,转而使用 tidy evaluation . 新方式下划线形式的新形式是什么?如何使用 R CMD 检查来避免 undefin
我们可以定义一个使用动态列名的函数,然后在map中使用它。请注意 ListCol 中的 tibbles 如何具有列名称 a 和 b(取自原始文件中的 Letter 列)蒂 bool 。 library
接上较早的话题,( Use string as filter in dplyr? ),新的 tidyeval 会是什么?对此的回答是,因为 filter_ 已被弃用。 有没有办法在 dplyr 中使用
library(tidyverse) set.seed(1) graph.data 1 2009-10-14 4.87 2 2009-10-15 8.
所以这个例子基本上来自https://tidyeval.tidyverse.org/dplyr.html#patterns-for-single-arguments它工作得很好: library(ti
对于造成的困惑,我深表歉意,但最终,我发布的第一个示例(在页面底部)并没有帮助我弄清楚 tidyeval 如何与 mutate 一起工作,所以我添加了一个新示例。 我想创建一个接受三个参数的函数: 一
这个问题在这里已经有了答案: How to take in text/character argument without quotes (2 个答案) 关闭 7 个月前。 我写了一个函数。在我的函
library(tidyverse) input_name expr: ^filter(data, "birth_year" == 19) env: global 第 6 行 exp
我是一名优秀的程序员,十分优秀!