我认为这是一个简单的问题。
对于许多语言,您需要在编写函数之前提供返回类型。 但是我找不到R的解决方案。 我现在能做的唯一方法是进行调用,并使用str(),mode(),class()来检查返回的值。
但如果功能需要很长时间,我不能用这种方式 有一种简单的方法可以在我调用之前知道函数的返回类型吗?
顺便说一句,我可以通过键入?function_name找到一些返回类型,但很多帮助没有提到函数的返回类型。
Okey,这是为什么知道这个信息可能非常有用的事件:
1.我需要返回类型才能看到,在我得到返回值之后,我应该如何处理返回,对于简单的情况,如果我不知道返回类型是list还是dataframe,我不知道实际上有信息决定下一个使用哪个功能〜有时你不知道你有S3或S4对象,这让你不知道你应该使用@或$来处理它
2.假设两个包中有两个函数做同样的事情,一个给我一个连接,另一个给我一个html对象,如果我知道返回类型那么我可以很容易地选择我应该使用哪个函数案件。有时你只有限制时间连接到某些地方,那么你将浪费几个机会来检查返回类型答案 0 :(得分: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
}
答案 1 :(得分:0)
总之没有...
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返回一个&#34;字符&#34;键入或&#34;数字&#34;类型取决于传递给每个元素的函数。总的来说,你只需要习惯这种语言,如果没有任何作用,你可以先做一些小任务。