在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")