R语言中传递函数作为参数报错:找不到函数FUN的解决咨询
问题解决:R语言移动窗口过滤函数报错修复
错误原因
你定义函数时将FUN的默认值设为字符串"min",但在循环中直接调用FUN(vec[nmin:nmax])时,R会尝试寻找名为FUN的函数,而非字符串对应的min函数,因此出现"找不到FUN函数"的错误。
修正方案
方案1:支持字符串/函数对象两种传入方式(兼容原写法)
使用match.fun()将传入的函数名(字符串)或函数对象转换为可直接调用的函数:
moving_window_filter2 <- function(vec, deltan, FUN = "min") { spectrum <- vec n <- length(vec) # 转换FUN为可调用的函数对象 fun <- match.fun(FUN) for (i in 1:n) { nmin <- max(1, i - deltan/2) nmax <- min(n, i + deltan/2) spectrum[i] <- fun(vec[nmin:nmax]) } return(spectrum) }
这种写法兼容两种调用方式:
- 传函数名字符串:
moving_window_filter2(vec, 2, "mean") - 传函数对象:
moving_window_filter2(vec, 2, mean)
方案2:直接传入函数对象(更符合R常规写法)
将FUN的默认值改为函数本身,而非字符串,直接调用即可:
moving_window_filter2 <- function(vec, deltan, FUN = min) { spectrum <- vec n <- length(vec) for (i in 1:n) { nmin <- max(1, i - deltan/2) nmax <- min(n, i + deltan/2) spectrum[i] <- FUN(vec[nmin:nmax]) } return(spectrum) }
这种写法支持自定义函数传入,比如:
# 传入匿名自定义函数 moving_window_filter2(vec, 3, FUN = function(x) sum(x)/length(x))
测试示例
vec <- c(1,3,5,7,9) moving_window_filter2(vec, 2) # 输出结果:1 1 3 5 7
内容的提问来源于stack exchange,提问作者leparc
相关产品推荐
相关产品推荐

