我想以across()编程方式使用,例如,如果NULL向它传递一个空字符串,则该函数不会失败。这可能是使用函数的作用域变体,例如group_by_at(),但我想让它使用across().
另请注意,across()如果留空,当前将影响所有列。我不确定这样做的动机是什么;对我来说,如果没有列受到影响会更有意义。
这是一个使用函数计算变量平均值的快速示例y。传递分组变量适用于group_by_at(),但不适用于across()如图所示:
my_df <- tibble("x" = c("a", "a", "b", "b"), y = 1:4)
compute_mean1 <- function(df, grouping) { # compute grouped mean with across()
df %>%
group_by(across(all_of(grouping))) %>%
summarise(y = mean(y), .groups = "drop")
}
compute_mean2 <- function(df, grouping) { # compute grouped mean with group_by_at()
df %>%
group_by_at(grouping) %>%
summarise(y = mean(y), .groups = "drop")
}
compute_mean1(my_df, "x")
#> # …Run Code Online (Sandbox Code Playgroud) assignInMyNamespace如果甚至建议在生产代码中使用此功能,我想知道一些使用的软件包及其用途。帮助页面提供以下信息:
assignInMyNamespace旨在从包内的函数调用,并选择命名空间作为调用它的函数的环境。
但是,它也给出了以下警告assignInNamespace:
assignInNamespace不应在最终代码中使用,如果从包中调用,将来会抛出错误。某些用途已经被禁止。
大概这是因为包不应该尝试更改其他包的命名空间,这就是警告不适用于assignInMyNamespace. 这是真的?
注意:我正在开发一个带有未导出测试功能的包,该功能允许包中的任何未导出功能暂时替换为保存其输入和输出的功能。我也在考虑使用这种在记忆/非记忆功能版本之间切换的技术。
编辑:在实践中,assignInMyNamespace只更改未导出的函数 - 而不是如前所述的“包中的任何函数”。我最近才意识到这一点,它实际上在我正在开发的包中投入了一个扳手。因此,我也很想知道在包使用过程中是否有解决导出和未导出函数的问题的解决方案。
的{rlang}文档help("nse-force")给出了以下内容:
函数参数的卷曲运算符 {{ }} 有点特殊,因为它强制函数参数并立即解除它。解融合的表达式被就地替换,准备在另一个上下文(例如数据帧)中进行计算。
我同样对 'bang-bang' 运算符感到困惑!!,关于它的文档对于幕后发生的事情同样迟钝。
我的问题不是关于如何使用该运算符,因为它的用法(我认为)非常简单。相反,我想知道这样的运算符在{rlang}幕后实际上是如何实现的。根据该包的作者之一的说法,{{ foo }}基本上变成了!!rlang::enquo(foo). 然而,我仍然不知道像这样的非标准运算符实际上是如何实现的,特别是考虑到这个运算符似乎“正常工作”,无论它是否被实际上它只适用于由 {rlang} 支持的函数 - 感谢@Konrad Rudolph 的更正。{rlang}函数使用。
查看源代码,我只能猜测它是用 C 或 C++ 完成的。谁能给我更多信息吗?