gpt4 book ai didi

r - 使用 brew/whisker 进行错误安全模板

转载 作者:行者123 更新时间:2023-12-04 11:26:17 25 4
gpt4 key购买 nike

外部程序需要一个带有一些控制参数的输入文件,我希望使用 R 自动生成这些文件。通常,我只使用 paste("parameter1: ", param1, ...)创建一长串文本,并输出到文件,但脚本很快变得不可读。这个问题可能很适合 mustache ,

library(whisker)

template= 'Hello {{name}}
You have just won ${{value}}!
'

data <- list( name = "Chris", value= 124)

whisker.render(template, data)

我的问题是,没有安全检查 data包含所有必需的变量,例如
whisker.render(template, data[-1])

将默默忽略我忘记指定名称的事实。但是,如果我无法生成完整的配置文件,我的最终程序将崩溃。

另一个模板系统由 brew 提供;它具有实际评估事物的优势,并且可能还有助于检测缺失的变量,
library(brew)

template2 = 'Hello <%= name %>
You have just won $<%= value %>!
'

data <- list( name = "Chris", value= 124)

own_brew <- function(template, values){
attach(values, pos=2)
out = capture.output(brew(text = template))
detach(values, pos=2)
cat(out, sep='\n')
invisible(out)
}

own_brew(template2, data)
own_brew(template2, data[-1]) # error

但是,我遇到了两个问题:
  • attach() ... detach()不理想,(时不时发出警告),或者至少我不知道如何正确使用它。我试图为 brew() 定义一个环境,但是限制太多,不知道base功能不再...
  • 即使发生错误,该函数仍会返回一个字符串。我试图将电话转接到 try()但我没有错误处理的经验。我如何告诉它退出不产生输出的功能?

  • 编辑:我已经更新了 brew使用新环境代替 attach() 的解决方案, 并在发生错误时停止执行。 ( ?capture.output 表明这不是在这里使用的正确函数,因为“如果在评估表达式时出现错误,则会尝试尽可能将输出写入文件”...)
    own_brew <- function(template, values, file=""){
    env <- as.environment(values)
    parent.env(env) <- .GlobalEnv
    a <- textConnection("cout", "w")
    out <- try(brew(text = template, envir=env, output=a))

    if(inherits(out, "try-error")){
    close(a)
    stop()
    }
    cat(cout, file=file, sep="\n")
    close(a)
    invisible(cout)
    }
    tryCatch 肯定有更简单的方法,但我无法理解其帮助页面中的任何内容。

    我欢迎关于更普遍问题的其他建议。

    最佳答案

    使用正则表达式从模板中检索变量名称,您可以在渲染之前进行验证,例如,

    render <- function(template, data) {
    vars <- unlist(regmatches(template, gregexpr('(?<=\\{\\{)[[:alnum:]_.]+(?=\\}\\})', template, perl=TRUE)))
    stopifnot(all(vars %in% names(data)))
    whisker.render(template, data)
    }

    render(template, data)

    关于r - 使用 brew/whisker 进行错误安全模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595621/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com