我可以从文档中看到rlang::enquo()和rlang::quo()在不同的上下文中使用。因此,我rlang::enysm()最近在函数声明中使用了(见下文)。然而,包裹在另一个 SE 函数调用中,我得到了一个意外错误,我猜这与惰性求值有关(如果我force(x)在 中,它就会消失f_enysm())。但似乎我也可以通过简单地使用sym(x)而不是ensym(x)因为x是一个不传达任何关于环境的信息(而不是quosures)的字符串来解决这个问题。
那安全吗?
如果是,我不知道什么时候应该更喜欢ensym(),sym并且建议的用途似乎与quo()/ enquo()、expr()/enexpr()等使用的术语不一致。
library(rlang)
f_ensym <- function(data, x, fun) {
x <- fun(x)
head(dplyr::arrange(data, !!x))
}
f_ensym(mtcars, "cyl", sym)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#> 2 24.4 4 146.7 …Run Code Online (Sandbox Code Playgroud) FROM语句中具有上述引用的图像。我们将此称为新的Dockerfile Dokerfile.development。Dockerfile.deployment。所以现在我看到以下选项来创建这两个图像:
Dokerfile.development到my中的所有内容Dockerfile.deployment,但在语句中使用基于r的图像FROM。缺点:我总是需要保持多个Dockerfile为最新。如果我添加另一个图像进行测试,则我有3个Dockerfile,它们有99%的重叠。另一种方法是首先创建一个Dockerfile.deployment具有所有部署要求的软件。然后,在部署映像之上构建开发映像。Dockerfile.development在Dockerfile中或多或少地从Dockerfile中获取了RStudio映像的安装说明,以将RStudio添加到部署映像,但将deplyoment映像作为基础映像。缺点:我再也无法理解自己的Dockerfile中的代码了。
使用多阶段构建,可以轻松地从一个映像中提取已构建的可执行文件(或几乎所有内容),然后将其用于另一映像,而不必复制构建可执行文件所需的所有依赖项。因此,我的想法是将RStudio映像中的相关文件提取到一个新映像中,该映像将成为我的部署映像。
我认为最后一个选项是首选,因为它是模块化程度最高的解决方案,并且在Dockerfile中的重复最少,维护负担也最低。
我的狭窄问题是:是否可以从构建RStudio映像中提取一个(单个)可执行文件,并将其放在部署映像的顶部?
我更开放的问题是:人们如何处理开发映像是部署映像以及可作为独立映像使用的其他一些工具的情况,并且他们希望避免重复,如候选解决方案下的两个第一个解决方案所示。
如果我想明确过度扩张,我可以使用这样的.data代词
library(dplyr)
cyl <- 3
transmute(as_tibble(mtcars), cyl_plus_one = .data$cyl + 1)
#> # A tibble: 32 x 1
#> cyl_plus_one
#> <dbl>
#> 1 7
#> 2 7
#> 3 5
#> 4 7
#> 5 9
#> 6 7
#> 7 9
#> 8 5
#> 9 5
#> 10 7
#> # ... with 22 more rows
Run Code Online (Sandbox Code Playgroud)
然而,相反的是,即如果我想明确避免过度扩张?在下面的示例中,我想添加一个新列,其中包含值b(通过函数调用提供,而不是b数据中的数据)加1,这显然不能按照现在的方式工作(因为过度扩展).
library(dplyr)
add_one <- function(data, b) {
data %>%
mutate(a = b + 1)
} …Run Code Online (Sandbox Code Playgroud) 我喜欢这个程序包,但是我想知道如何从tidyverse样式中更改一个规则:我想保留“ =”而不是“ <-”进行赋值。
我已阅读该说明:http : //styler.r-lib.org/articles/customizing_styler.html#implementation-details
但是我仍然不知道如何简单地更改该规则。我已经尝试过非常幼稚的:
library(styler)
force_assignment_op <- function (pd)
{
to_replace <- pd$token == "LEFT_ASSIGN"
pd$token[to_replace] <- "EQ_ASSIGN"
pd$text[to_replace] <- "="
pd
}
tidyverse_style()$token$force_assignment_op = force_assignment_op
Run Code Online (Sandbox Code Playgroud)
但是出现以下错误:
Error in tidyverse_style()$token$force_assignment_op =
force_assignment_op :
invalid (NULL) left side of assignment
Run Code Online (Sandbox Code Playgroud)
我想以某种方式修改它,之后便可以简单地运行styler插件。
如何在不使用 的情况下匹配所有以开头plan_且不结尾的单词?在下面的示例中,我只想匹配第二个字符串。我尝试使用负前瞻,但它不起作用,也许是因为贪婪?templateinvert = TRUE
names <- c("plan_x_template", "plan_x")
grep("^plan.*(?!template)$",
names,
value = TRUE, perl = TRUE
)
#> [1] "plan_x_template" "plan_x"
Run Code Online (Sandbox Code Playgroud)
我的意思是也可以通过两个正则表达式调用来解决问题,但我想看看它是如何以另一种方式工作的:-)
is_plan <- grepl("^plan_", names)
is_template <- grepl("_template$", names)
names[is_plan & !is_template]
#> [1] "plan_x"
Run Code Online (Sandbox Code Playgroud) 我有一个从源文件生成文档文件的钩子,用pre-commit.com 框架构建。在该钩子中调用的函数没有文件参数,因此它只是为目录中的所有源文件创建文档。钩子是一个system挂钩,即只是一个 bash 脚本,我在其中调用该函数来创建文档。然而,在 pre-commit.com 框架中,文件被传递给钩子,逻辑是在每个文件上执行一个钩子,这在大多数情况下是有意义的(例如分别对每个文件进行 lint)。所以我的问题是:如果有任何源文件更改,我如何确保文档挂钩运行一次,而不是在单个文件上多次(并行或顺序)运行?具体来说,我的钩子正在生成 R 文档,roxygen2::roxygenize()可以在这里找到。