R 萨普利说,当我相信一个论点存在时,它确实存在

R 萨普利说,当我相信一个论点存在时,它确实存在,r,function,machine-learning,sapply,R,Function,Machine Learning,Sapply,我有一个函数和一个由外部函数使用的“子函数”。我会像通常被问到的那样发布代码,但是我遇到的问题非常简单。主要功能是: cvKNN = function(dataSet, foldNum) { dataSet = data$train[, c("X1", "X2", "Y")] ## 200-by-3 training data foldSize = floor(nrow(dataSet)/foldNum) KVector = seq(

我有一个函数和一个由外部函数使用的“子函数”。我会像通常被问到的那样发布代码,但是我遇到的问题非常简单。主要功能是:

cvKNN = function(dataSet, foldNum) {
dataSet = data$train[, c("X1", "X2", "Y")] ## 200-by-3 training data
foldSize = floor(nrow(dataSet)/foldNum)

KVector = seq(1, (nrow(dataSet) - foldSize), 2)
cvKNNAveErrorRates = sapply(KVector, cvKNNAveErrorRate, dataSet,foldSize, foldNum)
test = cvKNNAveErrorRate()
此函数获取一个由200×3项组成的数据集,这些项表示最近邻居的位置信息。 我遇到的问题是:

cvKNNAveErrorRates = sapply(KVector, cvKNNAveErrorRate, dataSet,foldSize, foldNum)
调用CVKNAVEVERRORRATE来计算各种K值的错误率。这一比率将通过一系列约30K的电话来确定

cvKNNAveErrorRate = function(dataSet, foldSize, foldNum){

error = 0
for (runId in 1:foldNum) {
testSetIndex = ((runId - 1) * foldSize + 1):(ifelse(runId ==
foldNum, nrow(dataSet), runId * foldSize))
trainX = dataSet[-testSetIndex, c("X1", "X2")]
trainY = as.factor(dataSet[-testSetIndex, ]$Y)
testX = dataSet[testSetIndex, c("X1", "X2")]
testY = as.factor(dataSet[testSetIndex, ]$Y)
predictY = knn(trainX, testX, trainY, K)
error = error + sum(predictY != testY)
}
error = error/nrow(dataSet)
error

}
问题是,我得到了这个错误:

Error in FUN(X[[i]], ...) : object 'foldNum' not found
为什么会这样?显然,我已经将foldNum从上面的函数传递到函数中。为什么它找不到它?这是我在R中不理解的范围问题吗


谢谢

考虑这个简单的函数,其中我们从列表中采样值:

lst <- list(1:4, 13:16)

return_val <- function(x, ...) {
  sample(x, ...)
}
注意这是如何工作的<默认情况下,
return\u val
函数的code>x值是列表的元素。因此,对于第一次迭代,它将是
lst[[1]]
,对于第二次迭代,它将是
lst[[2]]
。请注意,我们不必在函数调用中的任何地方明确提到
lst
。我们传递的第二个参数(
1
)作为
sample
函数的第二个参数,即
size

我们可以使用匿名函数而不使用
return\u val
,并直接使用
sample
来了解发生了什么。与上述内容相当的是:

sapply(lst, function(x) sample(x, 1))
现在让我们假设你想把额外的参数传递给函数,也就是说,你想传递概率。如果您这样做:

sapply(lst, return_val, 1, c(0.1, 0.4, 0.4, 0.1))
这将返回一个错误:

sample.int(长度(x)、大小、替换、prob)中存在错误: 无效的“replace”参数

这是有意义的,因为它将
c(0.1,0.4,0.4,0.1)
作为
sample
的第二个参数,即
replace
。您可以使用复制相同的错误

sapply(lst, function(x) sample(x, 1, c(0.1, 0.4, 0.4, 0.1)))
为避免此错误,您将在
sample
中命名参数,即

sapply(lst, function(x) sample(x, 1, prob = c(0.1, 0.4, 0.4, 0.1)))
这一点与预期相符

当您使用
..
部分
sapply
且不使用匿名函数时,您需要执行相同的操作。现在可以这样做了:

sapply(lst, return_val, 1, prob = c(0.1, 0.4, 0.4, 0.1))

因此,要总结
sapply
/
lappy
的工作原理,如果默认情况下不命名参数,则
X
中的元素(即示例中的
lst
)是
FUN
的第一个参数(
此处为return\u val
),其余参数遵循相同的顺序。如果要更改参数的顺序,必须对其进行命名。

考虑这个简单的函数,其中我们从列表中采样值:

lst <- list(1:4, 13:16)

return_val <- function(x, ...) {
  sample(x, ...)
}
注意这是如何工作的<默认情况下,
return\u val
函数的code>x值是列表的元素。因此,对于第一次迭代,它将是
lst[[1]]
,对于第二次迭代,它将是
lst[[2]]
。请注意,我们不必在函数调用中的任何地方明确提到
lst
。我们传递的第二个参数(
1
)作为
sample
函数的第二个参数,即
size

我们可以使用匿名函数而不使用
return\u val
,并直接使用
sample
来了解发生了什么。与上述内容相当的是:

sapply(lst, function(x) sample(x, 1))
现在让我们假设你想把额外的参数传递给函数,也就是说,你想传递概率。如果您这样做:

sapply(lst, return_val, 1, c(0.1, 0.4, 0.4, 0.1))
这将返回一个错误:

sample.int(长度(x)、大小、替换、prob)中存在错误: 无效的“replace”参数

这是有意义的,因为它将
c(0.1,0.4,0.4,0.1)
作为
sample
的第二个参数,即
replace
。您可以使用复制相同的错误

sapply(lst, function(x) sample(x, 1, c(0.1, 0.4, 0.4, 0.1)))
为避免此错误,您将在
sample
中命名参数,即

sapply(lst, function(x) sample(x, 1, prob = c(0.1, 0.4, 0.4, 0.1)))
这一点与预期相符

当您使用
..
部分
sapply
且不使用匿名函数时,您需要执行相同的操作。现在可以这样做了:

sapply(lst, return_val, 1, prob = c(0.1, 0.4, 0.4, 0.1))

因此,要总结
sapply
/
lappy
的工作原理,如果默认情况下不命名参数,则
X
中的元素(即示例中的
lst
)是
FUN
的第一个参数(
此处为return\u val
),其余参数遵循相同的顺序。如果你想改变参数的顺序,你必须给它们命名。

CVKNAVEVERRORRATE接受三个参数,但是使用
sapply(KVector、CVKNAVERRORRATE、dataSet、foldSize、foldNum)
你给它四个参数。建议在
sapply
抱歉中命名参数-这对我来说没有意义。sappy看起来是这样的:
sappy(X,FUN,…,simplify=TRUE,USE.NAMES=TRUE)
。因此,
X
是我的数据集,
FUN
cvknaveerrorrate
,然后我添加了3个附加参数。我怎么能说我只有4个呢?我有2个是必要的,还有3个是根据文档中的
选择性添加的。我试着按如下方式命名,但仍然出现错误
cvknaveerrorrates=sapply(X=KVector,FUN=cvknaveerrorrate,dataSet=dataSet,foldSize=foldSize,foldNum=foldNum)
。我在这里是@Richard。sapply(列表或向量)的第一个参数应该是函数takes的第一个参数,您应该只提供另外两个参数。CVKNAVERRORRATE接受三个参数,但对于
sapply(KVector、CVKNAVERRORRATE、dataSet、foldSize、foldNum)
。建议在
sapply
抱歉中命名参数-这对我来说没有意义。sappy看起来是这样的:
sappy(X,FUN,…,simplify=TRUE,USE.NAMES=TRUE)
。因此,
X
是我的数据集,
FUN
cvknaveerrorrate
,然后我添加了3个附加参数。我怎么能说我只有4个呢?我没有