Kon*_*rad 4 functional-programming namespaces r function substitution
函数作为参数传递给函数。问题涉及:
::和:::呼唤函数在 x 上fun_tst执行函数FUN:
fun_tst <- function(x = 1:100, FUN = mean) {
return(FUN(x))
}
Run Code Online (Sandbox Code Playgroud)
meanfun_tst()
# [1] 50.5
Run Code Online (Sandbox Code Playgroud)
sumfun_tst(x = 1:1e3, FUN = sum)
# [1] 500500
Run Code Online (Sandbox Code Playgroud)
fun_tst <- function(x = 1:100, FUN = mean) {
msg <- paste("Executing function", FUN)
print(msg)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
Run Code Online (Sandbox Code Playgroud)
粘贴错误(“执行函数”,FUN):无法将“内置”类型强制为“字符”类型的向量
有趣的是,print可以处理FUN对象但结果返回函数体。
fun_tst <- function(x = 1:100, FUN = mean) {
print(FUN)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
Run Code Online (Sandbox Code Playgroud)
函数 (..., na.rm = FALSE) .Primitive("sum") [1] 500500
subsitutefun_tst <- function(x = 1:100, FUN = mean) {
fun_name <- substitute(FUN)
msg <- paste("Executing function", fun_name, collapse = " ")
print(msg)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
>> fun_tst(x = 1:1e3, FUN = sum)
[1] "Executing function sum"
[1] 500500
Run Code Online (Sandbox Code Playgroud)
::几乎就在那里,但当与以下内容一起使用时,它看起来完全一团糟:
>> fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
[1] "Executing function :: Executing function dplyr Executing function glimpse"
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ..
Run Code Online (Sandbox Code Playgroud)
fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
# Executing function glimpse from package dplyr
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
fun_tst(x = 1:1e3, FUN = sum)
# Executing function sum from package base
Run Code Online (Sandbox Code Playgroud)
第二次尝试(使用 )就快完成了substitute。问题来自于 R 将language对象转换为字符的方式:
> as.character(substitute(dplyr::glimpse))
[1] "::" "dplyr" "glimpse"
Run Code Online (Sandbox Code Playgroud)
paste鉴于此,以这种方式破坏它也就不足为奇了。我只需通过分别处理这两种情况来解决此问题:
fun_tst <- function(x = 1:100, FUN = mean) {
fun_name <- substitute(FUN)
if (length(fun_name) == 1) {
msg <- paste("Executing function", fun_name, "from package base")
} else {
msg <- paste("Executing function", fun_name[3], "from package", fun_name[2])
}
print(msg)
return(FUN(x))
}
Run Code Online (Sandbox Code Playgroud)
这适用于您的两个示例:
> fun_tst(x = 1:1e3, FUN = sum)
[1] "Executing function sum from package base"
[1] 500500
> fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
[1] "Executing function glimpse from package dplyr"
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
Run Code Online (Sandbox Code Playgroud)
然而,正如所写的,它会认为全局环境中的所有函数都来自base,即使它们是用户定义的或通过library调用引入的。如果这是您的用例,请不要明确地说“来自包基础”。
| 归档时间: |
|
| 查看次数: |
1729 次 |
| 最近记录: |