R模式中允许具有有限功能集的胶水?

R模式中允许具有有限功能集的胶水?,r,dplyr,tidyverse,r-environment,r-glue,R,Dplyr,Tidyverse,R Environment,R Glue,我正在使用glue()格式化字符串。理想情况下,我想让用户选择提供自己的、可能很复杂的格式化模式。这些文件通常作为yaml配置文件的一部分分发,yaml配置文件还包含许多其他设置 library(glue) df <- tibble(a = c(70,80,90,4,5), conversionunit = c(60,60,60,1,1)) pattern <- "{a/conversionunit} minutes" # loaded from user's c

我正在使用
glue()
格式化字符串。理想情况下,我想让用户选择提供自己的、可能很复杂的格式化模式。这些文件通常作为yaml配置文件的一部分分发,yaml配置文件还包含许多其他设置

library(glue)
df <- tibble(a = c(70,80,90,4,5), conversionunit = c(60,60,60,1,1))
pattern <- "{a/conversionunit} minutes" # loaded from user's config file
df <- df %>% mutate(output = glue(pattern))

# more complex alternative
pattern <- "{round(a/conversionunit, digits=2)} minutes" # loaded from user's config file
df <- df %>% mutate(output = glue(pattern))

我知道
glue\u safe
但是这比我想要的限制更大。理想情况下,我希望提供一个允许函数的列表

safe_fun <- list(`*` = `*`, `/` = `/`, "round" = round) %>% as.environment() # etc
safe_fun%as.environment()#等
并且只允许使用那些指定的。有什么方法可以做到这一点吗?

在此基础上:

库(胶水)
图书馆(dplyr)
df在此基础上:

库(胶水)
图书馆(dplyr)

df定义保存数据和函数的环境,并将其父级设置为
emptyenv()

库(胶水)
图书馆(tibble)#lst

safe\u fun定义保存数据和函数的环境,并将其父级设置为
emptyenv()

库(胶水)
图书馆(tibble)#lst
也许会很安全
safe_fun <- list(`*` = `*`, `/` = `/`, "round" = round) %>% as.environment() # etc
library(glue)
library(tibble) # lst

safe_fun <- lst(`*`, `/`, round)
safe_env <- list2env(c(df, safe_fun), parent = emptyenv())

# test 1
glue("{a/conversionunit} minutes", .envir = safe_env)
## 1.16666666666667 minutes
## 1.33333333333333 minutes
## 1.5 minutes
## 4 minutes
## 5 minutes

# test 2
glue("{sqrt(a)/conversionunit} minutes", .envir = safe_env)
## Error in sqrt(a) : could not find function "sqrt"