如何解决在R中动态创建和评估函数
我正在尝试从字符串输入中动态创建和评估函数,并再次陷入元编程/评估(https://adv-r.hadley.nz/metaprogramming.html)的困境。我觉得这已经得到了解答,但是我进行了搜索,但无法通过其他帖子找出解决方案。但是,如果已有答案,请告诉我并标记为重复。非常感谢您的时间和帮助!下面是该问题的代表。
library(dplyr)
library(purrr)
library(rlang)
library(palmerpenguins)
# Create data to join with penguins
penguin_colors <-
tibble(
species = c("Adelie","Chinstrap","Gentoo"),color = c("orange","purple","green")
)
# Create function to do specified join and print join type
foo <- function(JOINTYPE) {
# DOESN'T RUN
# JOINTYPE_join(penguins,penguin_colors,by = "species")
# call2(sym(paste0(JOINTYPE,"_join")),x = penguins,y = penguin_colors,by = "species")
print(JOINTYPE)
}
# Desired behavior of foo when JOINTYPE == "inner"
inner_join(penguins,by = "species")
#> # A tibble: 344 x 9
#> species island bill_length_mm bill_depth_mm flipper_length_… body_mass_g
#> <chr> <fct> <dbl> <dbl> <int> <int>
#> 1 Adelie Torge… 39.1 18.7 181 3750
#> 2 Adelie Torge… 39.5 17.4 186 3800
#> 3 Adelie Torge… 40.3 18 195 3250
#> 4 Adelie Torge… NA NA NA NA
#> 5 Adelie Torge… 36.7 19.3 193 3450
#> 6 Adelie Torge… 39.3 20.6 190 3650
#> 7 Adelie Torge… 38.9 17.8 181 3625
#> 8 Adelie Torge… 39.2 19.6 195 4675
#> 9 Adelie Torge… 34.1 18.1 193 3475
#> 10 Adelie Torge… 42 20.2 190 4250
#> # … with 334 more rows,and 3 more variables: sex <fct>,year <int>,#> # color <chr>
print("inner")
#> [1] "inner"
# Use function in for loop
for (JOINTYPE in c("inner","left","right")) {
foo(JOINTYPE)
}
#> [1] "inner"
#> [1] "left"
#> [1] "right"
# Use function in vectorised fashion
walk(c("inner","right"),foo)
#> [1] "inner"
#> [1] "left"
#> [1] "right"
由reprex package(v0.3.0)于2020-10-27创建
解决方法
一种选择是使用get()
来检索适当的功能:
join <- function(JOINTYPE) {
get( paste0(JOINTYPE,"_join") )
}
join("inner")(penguins,penguin_colors,by="species")
如果使用rlang
,则此处更合适的功能是rlang::exec
:
join2 <- function(JOINTYPE,...) {
rlang::exec( paste0(JOINTYPE,"_join"),... )
}
join2("inner",penguins,by="species")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。