使用函数参数作为名称在R中保存对象
我浏览了整个网站,没有找到这个困境的正确答案: 我有一个UDF来评估一些分类模型,使用不同的数据集,我想有一个单独的函数来评估它们。我希望有如下内容,给定模型和数据的名称,它计算一些度量(例如混淆矩阵),并将它们保存到函数外的对象 这里的问题是,我想使用我正在评估的模型的名称创建这个对象 我的结局是这样的:使用函数参数作为名称在R中保存对象,r,user-defined-functions,R,User Defined Functions,我浏览了整个网站,没有找到这个困境的正确答案: 我有一个UDF来评估一些分类模型,使用不同的数据集,我想有一个单独的函数来评估它们。我希望有如下内容,给定模型和数据的名称,它计算一些度量(例如混淆矩阵),并将它们保存到函数外的对象 这里的问题是,我想使用我正在评估的模型的名称创建这个对象 我的结局是这样的: foo <- function(x) {return(as.character(substitute(x)))} model1 <- lm(Sepal.Width ~ Sepal
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)
}
foo这里有一个建议,它并不能完全解决问题,但确实使函数工作
Validation.func <- function(model_name, dataset){
model_name_obj<- eval(parse(text = model_name))
Pred_Train = predict(model_name_obj, dataset)
assign(paste("Pred_Train_",model_name, sep=''), Pred_Train, envir=globalenv())
Pred_Train_prob = predict(model_name_obj, dataset, type = "prob")
MC_Train = confusionMatrix(Pred_Train, dataset$target_salto)
}
Validation.func("model1", data)
Validation.func因此,这里有一个建议,它并不能完全解决问题,但确实可以使函数工作
Validation.func <- function(model_name, dataset){
model_name_obj<- eval(parse(text = model_name))
Pred_Train = predict(model_name_obj, dataset)
assign(paste("Pred_Train_",model_name, sep=''), Pred_Train, envir=globalenv())
Pred_Train_prob = predict(model_name_obj, dataset, type = "prob")
MC_Train = confusionMatrix(Pred_Train, dataset$target_salto)
}
Validation.func("model1", data)
函数中的Validation.funcmodel\u name
必须是模型对象,因此不能用于需要字符的paste
函数
我认为您希望您的函数知道,模型对象在其来源的环境中实际上被称为“model1”。我认为这是一个相当棘手的尝试,因为您的模型对象可能会被各种名称调用
最简单的实现是分别给出模型对象和名称,使用前者进行预测,使用后者命名结果
func1 <- function(model, model_str, dataset)
{
p <- predict(model, dataset)
assign(paste("predict_", model_str, sep=""), p, envir=globalenv())
}
model1 <- lm(mpg ~ cyl, data=mtcars)
func1(model1, "model1", mtcars)
predict_model1
最后,为了给函数提供模型对象并让函数查找变量名,您可以使用match.call
函数恢复函数的调用方式
func3 <- function(model, dataset)
{
s <- match.call()
model_str <- as.character(s)[2]
p <- predict(model, dataset)
assign(paste("predict_", model_str, sep=""), p, envir=globalenv())
}
model3 <- lm(mpg ~ cyl, data=mtcars)
func3(model3, mtcars)
predict_model3
函数中的func3model\u name
必须是模型对象,因此不能用于需要字符的paste
函数
我认为您希望您的函数知道,模型对象在其来源的环境中实际上被称为“model1”。我认为这是一个相当棘手的尝试,因为您的模型对象可能会被各种名称调用
最简单的实现是分别给出模型对象和名称,使用前者进行预测,使用后者命名结果
func1 <- function(model, model_str, dataset)
{
p <- predict(model, dataset)
assign(paste("predict_", model_str, sep=""), p, envir=globalenv())
}
model1 <- lm(mpg ~ cyl, data=mtcars)
func1(model1, "model1", mtcars)
predict_model1
最后,为了给函数提供模型对象并让函数查找变量名,您可以使用match.call
函数恢复函数的调用方式
func3 <- function(model, dataset)
{
s <- match.call()
model_str <- as.character(s)[2]
p <- predict(model, dataset)
assign(paste("predict_", model_str, sep=""), p, envir=globalenv())
}
model3 <- lm(mpg ~ cyl, data=mtcars)
func3(model3, mtcars)
predict_model3
func3请检查和。如果模型名称不可粘贴,则问题不在分配中,您是否100%确定模型名称是字符串(而不是包含一个字符串的列表等)?您可以使用debug
或debugonce
并尝试打印粘贴(“Pred\u Train\u”,model\u name,sep=”)
model\u name是不可接受的,因为它实际上不是字符串。这里的问题是,我无法将其转换为字符串(我尝试使用foo函数,但它没有按我所想的方式工作)@Dason它是刚刚编写的,这是将参数转换为字符串的方法[foo=function(x)deparse(substitute(x))]。但是,如果我们尝试使用此方法,它不会接受传递给更高一级函数的参数。您是否确实将该代码放入函数中,然后调用foo(model_name)
?只需直接使用foo
(使用model_name而不是x)中的代码来获取传入内容的“name”。请查看并。如果model_name不可粘贴,则问题不在assign中,您是否100%确定model_name是一个字符串(而不是一个包含一个字符串的列表等)?您可以使用debug
或debugonce
并尝试打印粘贴(“Pred\u Train\u”,model\u name,sep=”)
model\u name是不可接受的,因为它实际上不是字符串。这里的问题是,我无法将其转换为字符串(我尝试使用foo函数,但它没有按我所想的方式工作)@Dason它是刚刚编写的,这是将参数转换为字符串的方法[foo=function(x)deparse(substitute(x))]。但是,如果我们尝试使用此方法,它不会接受传递给更高一级函数的参数。您是否确实将该代码放入函数中,然后调用foo(model_name)
?只需直接使用foo
中的代码(使用model_name而不是x)即可获得传入内容的“name”。它真的很有效!我会做一些额外的测试,但似乎这正是我想要的。我真的很感谢你的帮助:)真的很有效!我会做一些额外的测试,但似乎这正是我想要的。我真的很感谢你的帮助:)非常感谢!!我想第三种方法就是我想要的,它工作得很好,也很容易实现。非常感谢!!我认为第三种方法是我所寻找的,它工作得很好,也很容易实现。