【发布时间】:2021-07-01 18:30:02
【问题描述】:
我正在编写一个函数来从给定向量中的位置的向量中提取一个值。
func_name <- function(input_vec, input_n) {
sort(input_vec)
if(input_n > input_vec) {
return("Warning: input_n exceeds vector length")
}
else {
return(input_vec[,c(input_n)][input_vec == input_n])
}
}
input_vector <- c(1,2,30,40,50,60)
func_name(input, 3)
我正在尝试获取输出 30,以便函数从向量中提取第三个元素。当我运行该函数时,我收到以下错误消息:
the condition has length > 1 and only the first element will be usedError in input_vec[, c(input_n)] : incorrect number of dimensions
然后我阅读了错误消息,并认为使用 ifelse 语句运行它可能会发生冲突,所以我尝试了以下操作:
find_largestN <- function(input_vec, input_n) {
sort(input_vec)
if(input_n < input_vec) {
return(input_vec[,c(input_n)][input_vec == input_n])
}
else {
break
}
}
为此,我收到以下错误消息。
the condition has length > 1 and only the first element will be usedError in find_largestN(input_vec, 1) :
no loop for break/next, jumping to top level
我认为这会简化它并减少出错的机会,但显然它不起作用。是否对 if else 语句或函数中的子集有任何建议?
【问题讨论】:
-
使用
ifelse而不是if/else -
我认为您正在寻找函数
ifelse,它将向量作为输入,if和else只考虑向量的第一个元素 -
您的条件产生了一个非常简单的错误:您使用
input_n > input_vec,它不检查input_n是否超过input_vec的长度,而是创建一个合乎逻辑的比较向量——比如c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE)input_vec是c(1, 2, 30, 40, 50, 60)和n = 3——因为if一次只能评估一个TRUE/FALSE,它会显示警告the condition has length > 1 and only the first element will be used。 -
正如Skaqqs 的答案所指出的,您需要使用
length()来获得正确的条件:input_n > length(input_vec)。 -
您还犯了一个额外的错误,这一次是在您的
return()语句中:您应该简单地为 (input_vec[input_n]) 下标,而是将向量input_vec视为 @987654347 @:input_vec[,c(input_n)]。自然,将 1 维向量视为 2 维matrix会给您错误:Error in input_vec[, c(input_n)] : incorrect number of dimensions。
标签: r