外部程序需要一个带有一些控制参数的输入文件,我希望使用 R 自动生成这些参数。通常,我只是简单地使用paste("parameter1: ", param1, ...)
创建长文本字符串,然后输出到文件,但脚本很快变得不可读。这个问题可能很适合胡须,
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
,但我无法理解其帮助页面中的任何内容。
我欢迎就更普遍的问题提出其他建议。