gpt4 book ai didi

r-studio : is there a "strict mode"?

转载 作者:行者123 更新时间:2023-12-03 13:56:20 27 4
gpt4 key购买 nike

说而不是写

sort(tapply(CPS$C == "S", CPS$M, sum, na.rm=TRUE))
我写的
sort(tapply(CPS$C == "S", CPS$M, sum, rm.na=TRUE))
似乎 r-studio 会愉快地运行该函数,忽略关键参数 na.rm
它忽略 na.rm 是预期的(我确实用
错误的参数名称)。我发现令人惊讶的是它完全可以运行。
有什么方法可以说服 R/R-studio 抛出某种错误,向我展示
我打错了,而不是运行函数?

最佳答案

没有“严格”模式,特别是对于使用省略号将参数传递给其他函数的函数。这里sum不关心参数名称。例如

sum(1:4, whatever=4)
sum(1:4, 4)
运行得很好,并且都返回相同的值。您可以编写自己的包装函数来更积极地检查参数值,而不是使用此类函数。这是 sum 的“安全”版本
safe_sum <- function(...) {
cx <- match.call()
cn <- names(cx)[-1]
if (!is.null(cn)) {
bad_names <- cn[cn!="" & cn!="na.rm"]
if(length(bad_names)) {
stop(paste("unexpected named parameter:", paste(bad_names, collapse=", ")))
}
}
cx[[1]] <- quote(sum)
eval(cx)
}

safe_sum(1:5, rm.na=TRUE)
# Error in safe_sum(1:5, rm.na = TRUE) : unexpected named parameter: rm.na
您可以与 tapply 一起使用
set.seed(10)
CPS <- data.frame(
C = sample(c("S","T"), 50, replace=TRUE),
M = sample(LETTERS[1:4], 50, replace=TRUE)
)
sort(tapply(CPS$C == "S", CPS$M, safe_sum , na.rm=TRUE))
# D A B C
# 3 5 8 9
sort(tapply(CPS$C == "S", CPS$M, safe_sum , rm.na=TRUE))
# Error in FUN(X[[i]], ...) : unexpected named parameter: rm.na
如果你想用其他函数来做到这一点,你可以创建一个工厂来检查所有参数名称。这里有这样一个函数
check_match_names <- function(fun) {
args <- formalArgs(args(sum))
args <- args[args!="..."]
function(...) {
cx <- match.call()
cn <- names(cx)[-1]
if (!is.null(cn)) {
bad_names <- cn[cn!="" & !(cn %in% args)]
if(length(bad_names)) {
stop(paste("unexpected named parameter:", paste(bad_names, collapse=", ")))
}
}
cx[[1]] <- fun
eval.parent(cx)
}
}
然后你会创建你的功能
safe_sum <- check_match_names(sum)

关于r-studio : is there a "strict mode"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64001629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com