gpt4 book ai didi

r - 仅将 R 方法应用于某个类的*矩阵*

转载 作者:行者123 更新时间:2023-12-03 17:00:16 25 4
gpt4 key购买 nike

我正在开发的一个包包含一个 R method ,并且有一个我希望仅应用于数值矩阵的函数。

我的函数将调用一个 C 函数,该函数需要一个数字矩阵作为其输入。我想让其他包的作者更容易为(比如)数字向量或字符矩阵编写单独的处理程序,而不必编辑我的包中的函数。

为了一个简单的例子,假设我希望函数将一个添加到矩阵中:

AddOne <- function (x) UseMethod('AddOne')
AddOne.[numeric-AND-matrix] <- function (x) add_one_in_c(x)

AddOne(1) # Should report "No applicable method"
AddOne(matrix("one")) # Should report "No applicable method"
AddOne(matrix(1)) # Should send the matrix to add_one_in_c()

只是看看是否 x是一个数字,或者一个矩阵,太笼统了:
AddOne <- function (x) UseMethod('AddOne')
AddOne.numeric <- function (x) message("X is numeric, but may not be a matrix")
AddOne.matrix <- function (x) message("X is a matrix, but may not be numeric")

我一直是 discouraged从使用 inherits出于这种目的:
AddOne <- function (x) UseMethod('AddOne')
AddOne.matrix <- function (x) {
if (inherits(x, 'numeric')) {
add_one_in_c(x)
} else {
NextMethod(x)
}
}

最后一个解决方案也很难扩展。也许其他人可以通过编写 AddOne.character() 来处理字符矩阵。 ,但此函数还必须处理字符向量。

有没有办法充分利用方法协议(protocol)?

最佳答案

您可以定义一个默认方法来处理除矩阵之外的所有内容。然后在矩阵方法中,如果它不是数字,您只需调用 NextMethod ,这将调用默认方法。因此,您只需要编写一个错误消息和一个矩阵方法。

# Here's a stand in for your C function:
add_one_in_c <- function(x) x + 1

AddOne <- function(x) UseMethod('AddOne')
AddOne.default <- function(x) stop("No applicable method")
AddOne.matrix <- function(x) if (is.numeric(x)) add_one_in_c(x) else NextMethod()

所以,测试它我们得到:
char_matrix <- matrix(LETTERS[1:9], nrow = 3)
num_matrix <- matrix(1:9, nrow = 3)

AddOne(num_matrix)
#> [,1] [,2] [,3]
#> [1,] 2 5 8
#> [2,] 3 6 9
#> [3,] 4 7 10

AddOne(char_matrix)
#> Error in AddOne.default(char_matrix) : No applicable method

AddOne(1:9)
#> Error in AddOne.default(1:9) : No applicable method

附录

另一种更容易根据需要为更多类添加方法的方法是使用函数 AddOne作为“看门人”,确保只处理矩阵,然后根据底层数据的类调度 S3 方法:
add_one_in_c   <- function(x) x + 1

AddOne <- function(x)
{
if(class(x) != "matrix") stop("No applicable method")
return(AddOne_basic(as.vector(x), nrow(x), ncol(x)))
}

AddOne_basic <- function(x, r, c) UseMethod("AddOne_basic")

AddOne_basic.default <- function(x, r, c) stop("No appicable method")

AddOne_basic.numeric <- function(x, r, c) {
dim(x) <- c(r, c);
add_one_in_c(x)
}

所以扩大处理 AddOne对于其他基本类型,您添加适当的 AddOne_basic方法。显然,在编写包时,您可能决定不导出“后端” AddOne_basic方法。

关于r - 仅将 R 方法应用于某个类的*矩阵*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62001733/

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