我glue()
用来格式化字符串。理想情况下,我想给用户提供他自己的、可能复杂的格式模式的选项。这些通常作为 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
但是,由于语句可能执行任意代码,因此存在安全风险。下面的例子当然是良性的。风险之所以存在,是因为用户可能会在没有详细研究的情况下下载和使用复杂的配置文件,并且不良行为者可能会分发邪恶的配置文件。
pattern <- "{shell('echo 1', intern = TRUE)} {a}"
df <- df %>% mutate(output = glue(pattern))
但是我知道glue_safe
这比我想要的更严格。理想情况下,我想提供允许的功能列表
safe_fun <- list(`*` = `*`, `/` = `/`, "round" = round) %>% as.environment() # etc
并只允许使用那些指定的。有没有办法做到这一点?