使用函数参数作为名称在 R 中保存对象
Save an object in R using a function parameter as name
我翻遍了整个网站,没有得到这个难题的正确答案:
我有一个 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"。
有人知道怎么解决吗?
所以这里有一个建议,虽然不能完全解决问题,但可以使功能正常工作。
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)
我所做的与您所做的几乎相反。我将 model_name
作为字符串传递,然后使用 parse(text = model_name)
对其求值。请注意,评估的对象现在称为 model_name_obj
并在 predict
函数中传递。
我后来在函数中遇到了一些错误,但它们与手头的问题无关。他们必须处理 predict
中的 type
参数以及无法识别 confusionMatrix
,因为我假设我没有加载相应的包。
函数中的 model_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
另一种实现方式虽然棘手,但如果小心使用,它会只给出模型的角色名称,并通过 get
函数从父环境中获取模型对象。
func2 <- function(model_str, dataset)
{
p <- predict(get(model_str, envir=parent.env(environment())), dataset)
assign(paste("predict_", model_str, sep=""), p, envir=globalenv())
}
model2 <- lm(mpg ~ cyl, data=mtcars)
func2("model2", mtcars)
predict_model2
最后,为了将模型对象交给函数,让函数找到变量名,然后就可以使用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
我翻遍了整个网站,没有得到这个难题的正确答案:
我有一个 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"。
有人知道怎么解决吗?
所以这里有一个建议,虽然不能完全解决问题,但可以使功能正常工作。
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)
我所做的与您所做的几乎相反。我将 model_name
作为字符串传递,然后使用 parse(text = model_name)
对其求值。请注意,评估的对象现在称为 model_name_obj
并在 predict
函数中传递。
我后来在函数中遇到了一些错误,但它们与手头的问题无关。他们必须处理 predict
中的 type
参数以及无法识别 confusionMatrix
,因为我假设我没有加载相应的包。
model_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
另一种实现方式虽然棘手,但如果小心使用,它会只给出模型的角色名称,并通过 get
函数从父环境中获取模型对象。
func2 <- function(model_str, dataset)
{
p <- predict(get(model_str, envir=parent.env(environment())), dataset)
assign(paste("predict_", model_str, sep=""), p, envir=globalenv())
}
model2 <- lm(mpg ~ cyl, data=mtcars)
func2("model2", mtcars)
predict_model2
最后,为了将模型对象交给函数,让函数找到变量名,然后就可以使用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