You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:05:21