如何在 R 中调用包含逗号的函数?
How to call a function that contains a comma in R?
在 R 中使用 S3 或 S4 classes 时,通常将 class 设置为通用 my_generic
,然后为每个子类型使用点 my_generic.my_type
。最近,我一直看到这种模式,但使用逗号而不是句点 my_generic,my_type
。问题是我无法使用帮助运算符 ?
或在控制台中输入函数名称,因为逗号被视为错误。有解决方法吗?我试过使用反引号,但它不起作用。
ComplexHeatmap
包中的 draw
方法就是一个例子:
methods(draw)
[1] draw.colorkey draw.details draw,HeatmapAnnotation-method
[4] draw,HeatmapList-method draw,Heatmap-method draw.key
draw,SingleAnnotation-method
?draw.colorkey
有效,但 ?draw,HeatmapAnnotation-method
无效。
首先,直接调用方法是非常糟糕的做法,尤其是对于 S4。您正在查看的 "functions with a comma" 实际上是 S4 方法。
帮助页面
要查找帮助页面(如果存在),您可以像这样使用引号:
?"draw,Heatmap-method"
但不能保证成功。这在很大程度上取决于包的作者是否为这些方法提供了单独的帮助文件,或者是否使用了正确的别名。在这种特殊情况下,您会在帮助页面上看到 ?draw
包的作者添加了几个指向特定方法的链接。
查找所有 S4 方法
要单独了解所有 S4 方法,请使用 showMethods
而不是 methods
。
> library(ComplexHeatmap)
> showMethods("draw")
Function: draw (package ComplexHeatmap)
object="Heatmap"
object="HeatmapAnnotation"
object="HeatmapList"
object="SingleAnnotation"
查看某个方法的内部代码
要获取实际方法以便查看内部代码,请使用 getMethod
:
getMethod(draw, signature = "Heatmap")
Method Definition:
function (object, ...)
{...
}
.local(object, ...)
}
<environment: namespace:ComplexHeatmap>
Signatures:
object
target "Heatmap"
defined "Heatmap"
使用特定的 S4 方法(但不是真的)
您可以分配该调用的结果并将其用作函数:
mat = matrix(rnorm(80, 2), 8, 10)
mat = rbind(mat, matrix(rnorm(40, -2), 4, 10))
rownames(mat) = letters[1:12]
colnames(mat) = letters[1:10]
ht = Heatmap(mat)
myMethod <- getMethod(draw, signature = "Heatmap")
myMethod(ht)
但是您不应该尝试直接调用方法。最后一次调用的结果与
完全相同
draw(ht)
所以你最好使用通用函数,让调度完成它的工作。
在 R 中使用 S3 或 S4 classes 时,通常将 class 设置为通用 my_generic
,然后为每个子类型使用点 my_generic.my_type
。最近,我一直看到这种模式,但使用逗号而不是句点 my_generic,my_type
。问题是我无法使用帮助运算符 ?
或在控制台中输入函数名称,因为逗号被视为错误。有解决方法吗?我试过使用反引号,但它不起作用。
ComplexHeatmap
包中的 draw
方法就是一个例子:
methods(draw)
[1] draw.colorkey draw.details draw,HeatmapAnnotation-method
[4] draw,HeatmapList-method draw,Heatmap-method draw.key
draw,SingleAnnotation-method
?draw.colorkey
有效,但 ?draw,HeatmapAnnotation-method
无效。
首先,直接调用方法是非常糟糕的做法,尤其是对于 S4。您正在查看的 "functions with a comma" 实际上是 S4 方法。
帮助页面
要查找帮助页面(如果存在),您可以像这样使用引号:
?"draw,Heatmap-method"
但不能保证成功。这在很大程度上取决于包的作者是否为这些方法提供了单独的帮助文件,或者是否使用了正确的别名。在这种特殊情况下,您会在帮助页面上看到 ?draw
包的作者添加了几个指向特定方法的链接。
查找所有 S4 方法
要单独了解所有 S4 方法,请使用 showMethods
而不是 methods
。
> library(ComplexHeatmap)
> showMethods("draw")
Function: draw (package ComplexHeatmap)
object="Heatmap"
object="HeatmapAnnotation"
object="HeatmapList"
object="SingleAnnotation"
查看某个方法的内部代码
要获取实际方法以便查看内部代码,请使用 getMethod
:
getMethod(draw, signature = "Heatmap")
Method Definition:
function (object, ...)
{...
}
.local(object, ...)
}
<environment: namespace:ComplexHeatmap>
Signatures:
object
target "Heatmap"
defined "Heatmap"
使用特定的 S4 方法(但不是真的)
您可以分配该调用的结果并将其用作函数:
mat = matrix(rnorm(80, 2), 8, 10)
mat = rbind(mat, matrix(rnorm(40, -2), 4, 10))
rownames(mat) = letters[1:12]
colnames(mat) = letters[1:10]
ht = Heatmap(mat)
myMethod <- getMethod(draw, signature = "Heatmap")
myMethod(ht)
但是您不应该尝试直接调用方法。最后一次调用的结果与
完全相同draw(ht)
所以你最好使用通用函数,让调度完成它的工作。