Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用函数参数作为名称在R中保存对象_R_User Defined Functions - Fatal编程技术网

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

使用函数参数作为名称在R中保存对象,r,user-defined-functions,R,User Defined Functions,我浏览了整个网站,没有找到这个困境的正确答案: 我有一个UDF来评估一些分类模型,使用不同的数据集,我想有一个单独的函数来评估它们。我希望有如下内容,给定模型和数据的名称,它计算一些度量(例如混淆矩阵),并将它们保存到函数外的对象 这里的问题是,我想使用我正在评估的模型的名称创建这个对象 我的结局是这样的: foo <- function(x) {return(as.character(substitute(x)))} model1 <- lm(Sepal.Width ~ Sepal

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

我有一个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)
}

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.func
model\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
model\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”。它真的很有效!我会做一些额外的测试,但似乎这正是我想要的。我真的很感谢你的帮助:)真的很有效!我会做一些额外的测试,但似乎这正是我想要的。我真的很感谢你的帮助:)非常感谢!!我想第三种方法就是我想要的,它工作得很好,也很容易实现。非常感谢!!我认为第三种方法是我所寻找的,它工作得很好,也很容易实现。