R语言中将函数作为参数传入报错,如何正确实现函数传参?
问题描述
我定义了如下两个示例函数:
a <- function(x) return(mean(x)) b <- function(x) return(median(x))
我希望编写另一个函数,将函数a或b作为参数传入。尝试编写的oper函数如下:
oper <- function(f, x) { ifelse(f == "a", a(x), b(x)) }
但执行oper(a, c(3,4,5))时,出现错误:
Error in f == "a" : comparison (1) is possible only for atomic and list types
注:mean(x)和median(x)仅作为示例使用。请问如何正确实现将函数作为参数传入另一个函数的功能?
解决方案
错误原因是你把函数对象和字符串直接做相等比较:f == "a"里的f是传入的函数(比如a),属于function类型,而"a"是字符串,两者类型不匹配,无法直接比较,因此报错。
在R中,函数作为参数传入后,直接调用该函数即可,不需要额外判断:
oper <- function(f, x) { f(x) }
测试验证:
# 传入函数a,计算均值 oper(a, c(3,4,5)) # 输出:4 # 传入函数b,计算中位数 oper(b, c(3,4,5)) # 输出:4
如果确实需要基于函数名称做分支处理(不推荐,这种写法灵活性差),可以通过deparse(substitute(f))获取函数的名称字符串,再做判断:
oper <- function(f, x) { func_name <- deparse(substitute(f)) if (func_name == "a") { a(x) } else if (func_name == "b") { b(x) } else { stop("不支持该函数") } }
但这种方式对匿名函数等场景不兼容,因此优先选择直接调用传入函数对象的写法。
内容的提问来源于stack exchange,提问作者Dawit Zuri
相关产品推荐
相关产品推荐

