R中的传递值问题(即使有副本)

时间:2019-06-23 07:31:19

标签: r

在R中,参数是通过值传递的,因此我们不需要复制任何内容-我们确定函数不会修改传递参数的参数。而且,我对此有一个奇怪的问题。在我的KNN函数中,调整参数k:我将参数传递给 cross_validate函数,后者调用 KNN函数;我循环执行并选择最佳参数。问题是,在交叉验证后,我用原始参数得到一个错误"object 'original_training_set' not found".

if (is.data.frame(training_set))
{
  original_training_set <- data.table::copy(training_set)
  training_set <- data.matrix(training_set)
}
else
{
  if (!is.matrix(training_set))
    stop("training_set must be data frame or matrix")
}

print(original_training_set) # here everything's all right

if (is.numeric(k) && k < 1)
{ stop("k must be >= 1") }
else if (k == "all")
{ k <- nrow(training_set) }
else if (is.numeric(k))
{ k <- min(k, ncol(training_set)) }
else if (k == "best_fit")
{
  best_k <- 0
  best_perc <- 0
  source("./source./test.R")

  for (i in 1:as.integer(sqrt(nrow(training_set))))
  {
    perc <- cross_validate(training_set, 5, predict_param, i, metric, weighting_scheme)
    if (perc > best_perc)
    {
      best_k <- i
      best_perc <- perc
    }
  }

  perc <- cross_validate(training_set, 5, predict_param, "all", metric, weighting_scheme)
  if (perc > best_perc)
    best_k <- nrow(training_set)

  k <- best_k
}
else
{ stop('k must be one of: numeric, "all", "best_fit"') }

print(original_training_set) # here I get an error

cross_validate函数仅返回良好预测值的百分比,因此不会更新任何矩阵。第一个打印效果很好,而第二个打印却出错。我绝对不知道为什么,因为传递值应该可以保护我免受任何不必要的修改。我什至复制了** training_set(**我以前没有做过),但是得到了相同的结果。

编辑 test.R的内容:

cross_validate <- function(dataset, parts, predict_param, k="all", metric="hassanat", weighting_scheme="inverted")
{
  percentages <- vector(length=parts)
  part_size <- round(nrow(dataset) / parts)
  res <- NULL
  for (i in 1:parts)
  {
    if (i != parts)
    {
      left <- (i - 1) * part_size + 1
      right<- i * part_size
      predict_set <- dataset[left:right,]
      training_set <- dataset[-(left:right),]
    }
    else
    {
      left <- (i - 1) * part_size + 1
      right <- nrow(dataset)
      predict_set <- dataset[left:right,]
      training_set <- dataset[-(left:right),]
    }

    source("./source./main.R")
    predicted_set <- knn(training_set, predict_set, predict_param, k, metric, weighting_scheme)
    res <- rbind(res, data.frame(predicted_set))

    percentages[i] <- round(100*sum(predict_set[, predict_param] == predicted_set[, predict_param]) / nrow(predict_set), digits=3)
  }

  write.table(res, file="./results.csv", row.names=FALSE, col.names=FALSE, sep=",", quote=FALSE)
  mean(percentages)
}

无法提供最小的可复制示例,因为我必须上传整个项目(文件很长且相互连接)。我直到错误点为止的所有操作都在上面的代码中。我只用:

mydata <- iris
perc <- cross_validate(mydata, 5, 1, k="best_fit")

0 个答案:

没有答案