【发布时间】:2017-06-19 11:51:07
【问题描述】:
我翻遍了整个网站,都找不到这个难题的正确答案:
我有一个 UDF 用于评估一些分类模型,具有不同的数据集,我希望有一个单独的函数来评估它们。我想要类似下面的东西,给定模型的名称和数据,它会计算一些指标(例如混淆矩阵)并将它们保存到函数外部的对象中。
这里的问题是我想使用我正在评估的模型的名称来创建这个对象。
我最终得到了这样的结果:
foo <- function(x) {return(as.character(substitute(x)))}
model1 <- lm(Sepal.Width ~ Sepal.Length, iris)
Validation.func <- function(model_name, dataset){
Pred_Train = predict(model_name, dataset)
assign(paste("Pred_Train_",foo(model_name), sep=''), Pred_Train, envir=globalenv())
Pred_Train_prob = predict(model_name, dataset, type = "prob")
MC_Train = confusionMatrix(Pred_Train, dataset$target_salto)
}
为Validation.func(model1,iris) 运行它我们希望将变量存储为“Pred_Train_model1”。
由于 model_name 不是字符串,我们不得不尝试使用 foo 函数(这是我在这里找到的答案)foo = function(x)deparse(substitute(x)) 我没有得到我想要的,因为它将对象保存为:“Pred_Train_model_name ” 而不是“Pred_Train_model1”。
有人知道怎么解决吗?
【问题讨论】:
-
如果 model_name 不能用于粘贴,问题不在分配中,您是否 100% 确定 model_name 是一个字符串(而不是例如包含一个字符串等的列表)?您可以使用
debug或debugonce并尝试打印paste("Pred_Train_",model_name, sep='') -
model_name 是不可接受的,因为它确实不是字符串。这里的问题是我无法将其转换为字符串(我尝试使用 foo 函数,但它并没有像我想象的那样工作)
-
@Dason 后面写的,就是把参数转换成字符串[foo = function(x)deparse(substitute(x))]的方式。但是如果我们尝试使用这个方法,它不会接受我们传递给更高层函数的参数。
-
您是否真的将代码放入函数中,然后调用
foo(model_name)?直接使用foo中的代码(使用model_name而不是x)来获取传入的“名称”。