在R中动态创建和评估函数

如何解决在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?