gpt4 book ai didi

r - R中的类似枚举的参数

转载 作者:行者123 更新时间:2023-12-04 00:30:23 25 4
gpt4 key购买 nike

我是 R 新手,目前正在尝试为 R 函数(或 RC/R6 类方法)提供类似枚举的参数,我目前使用字符向量加 match.arg类似于以下内容:

EnumTest = function(enum = c("BLUE", "RED", "BLACK")) {
enumArg <-
switch(
match.arg(enum), "BLUE" = 0L, "RED" = 1L, "BLACK" = 2L
)
switch(enumArg,
# do something
)
}

是否有更好/更简洁的方法来模仿 R 中类似枚举的行为?例如。一个大问题是用户必须知道参数的可能值集并手动将其键入为字符串 - 没有任何建议或自动完成......

如果没有其他更好的方法,可以改进上述方法的一件事 - 通过全局预定义枚举或说作为 R6 类的私有(private)成员来使其更简洁会很好:
Color <- c("BLUE", "RED", "BLACK")

然后可以(重新)在一个或多个函数定义中使用它,例如:
EnumTest = function(enum = Color) { 
...

但是,我不确定如何使用这个 Color match.arg 中的矢量功能。如果我能定义 Color就好了作为一个 map ,键是实际的颜色值,值是整数表示 - 但我不确定这有多明智。无论如何,也许存在更常见的简洁方法。

主要目标是为我的包和功能的用户提供一个易于使用的直观界面(例如,查找可能值集的简单方法、制表符补全、自动建议等),然后是使用类似枚举的参数对此类函数进行标准化开发

最佳答案

我喜欢使用环境作为枚举的替代品,因为您可以锁定它们以防止在创建后进行任何更改。我这样定义我的创建函数:

Enum <- function(...) {

## EDIT: use solution provided in comments to capture the arguments
values <- sapply(match.call(expand.dots = TRUE)[-1L], deparse)

stopifnot(identical(unique(values), values))

res <- setNames(seq_along(values), values)
res <- as.environment(as.list(res))
lockEnvironment(res, bindings = TRUE)
res
}

像这样创建一个新的枚举:
FRUITS <- Enum(APPLE, BANANA, MELON)

我们可以访问这些值:
FRUITS$APPLE

但是我们不能修改它们或创建新的:
FRUITS$APPLE <- 99  # gives error
FRUITS$NEW <- 88 # gives error

关于r - R中的类似枚举的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838392/

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