gpt4 book ai didi

r - 使用函数参数作为名称在 R 中保存对象

转载 作者:行者123 更新时间:2023-12-02 03:53:58 24 4
gpt4 key购买 nike

我浏览了整个网站,但找不到这个困境的正确答案:

我有一个 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 必须是模型对象,因此不能在需要字符的 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

关于r - 使用函数参数作为名称在 R 中保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44629832/

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