有没有一种方法可以确定函数的返回类型?

3

我认为这是一个简单的问题。

对于许多编程语言,你需要在编写函数之前提供返回类型。 然而,对于R语言,我没有找到解决方法。 目前我唯一能做的就是调用函数,并使用str(),mode(),class()来检查返回值。

但如果函数执行时间很长,我就不能使用这种方法。 是否有一种简单的方法可以在调用函数之前知道返回类型呢?

顺便说一句,我可以通过输入?function_name找到一些返回类型,但许多帮助文件并没有提到函数的返回类型。

好的,这就是为什么知道这个信息非常有用的情况:

1. 我需要知道返回类型以便在获得返回值后决定如何处理它。对于简单情况,如果我不知道返回类型是列表还是数据框,则实际上无法确定下一步应该使用哪个函数~ 有时候你不知道你得到了S3还是S4对象,这使你不知道应该使用@还是$去处理它

2. 假设两个包中有两个函数执行相同的操作,一个将返回连接,另一个将返回HTML对象,如果我知道返回类型,那么我可以根据我的情况轻松选择应该使用哪个函数。有时候你只有有限的次数连接到某些地方,然后你会浪费几次机会来检查返回类型。


1
不幸的是,在R中它并没有被完美定义。如果文档不清楚,你唯一的选择就是阅读源代码、教程并查看其他人使用该函数的方法。 - r2evans
更好的问题是,为什么你需要返回类型?在 R 编程中,你很少需要知道这个。 - Hong Ooi
假设有两个函数在两个包中执行相同的操作,一个返回连接,另一个返回HTML对象。如果我知道返回类型,那么根据我的情况,我可以轻松选择应该使用哪个函数。有时您只能连接到某些地方有限次数,然后您将浪费几次机会来检查返回类型。 - cloudscomputes
很遗憾的是,文档中的“Value”部分并没有标准化...我猜可以进行一些文本挖掘来自动提取一些或大多数内容,但我只检查了一些示例,即使基础包也非常不一致。 - moodymudskipper
@Moody_Mudskipper 是的,这不是我第一次在任何帮助文档中找不到可靠的值信息。 - cloudscomputes
显示剩余2条评论
2个回答

1
简而言之,没有...
R是一种动态类型语言,它的许多函数根据传递的参数返回不同的类型,这在我看来是R的一个优点,许多函数接受许多类型并返回许多类型。一个快速的例子:
mode(sapply(vector(mode="list", 10) ,function (x) return ('a')))
[1] "character"
mode(sapply(vector(mode="list", 10) ,function (x) return (1)))
[1] "numeric"

sapply返回一个"character"类型或"numeric"类型,具体取决于应用于每个元素的函数。总的来说,你只需要熟悉这种语言,如果什么都不起作用,先从小任务开始做。


在上面的例子中,它甚至比我提到的更进一步。sapply将一个“列表”作为其第一个参数,将一个“clojure”作为其第二个参数,但返回值的类型是不同的。 - Joao Bregunci
是的,但有时你只有几次机会,比如说你只有3次连接到某个服务器的权限,而你需要花费一次来检查返回类型...这很糟糕,在其他语言中我们知道返回类型,所以我们甚至不需要调用它,我们知道如何处理响应。 - cloudscomputes

1
在R语言中,有多种处理函数的多个返回类型的方法。
假设您有一个名为f的函数调用了g,后者可以返回不同的类型。您的第一种选择是使用显式类型检查:
f <- function(x)
{
    ...
    y <- g(x)
    if(is.data.frame(y))
    {
        # process result as a data frame
    }
    else if(is.list(y))
    {
        # process y as a list
        # this must go after is.data.frame, because a list is also a data frame
    }
    ...
}

现在,当f返回时,它将检查g的结果,然后调用适当的代码来处理它。
如果您只有少量可能的类型可供选择,那么这很好。一旦类型数量变得很大,最好使用更系统化的方法。该选项是使用R的对象框架。最简单的框架是S3,所以让我们看看它。
f <- function(x)
{
     y <- g(x)
     f_result(y)
}

# this is the f_result _generic_: it dispatches individual methods based on the class of y
f_result <- function(y)
{
     UseMethod("f_result")
}

# f_result _method_ for data frames
f_result.data.frame <- function(y)
{
     # process result as a data frame
}

# f_result method for lists
f_result.list <- function(y)
{
     # process result as a list
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接