有没有可能;“包装”;一个R函数来修正它的功能?
是否可以包装R函数以修改其功能 这里有一个玩具的例子来解释我的意思。考虑这个函数<代码> SUM2< /代码>:有没有可能;“包装”;一个R函数来修正它的功能?,r,metaprogramming,R,Metaprogramming,是否可以包装R函数以修改其功能 这里有一个玩具的例子来解释我的意思。考虑这个函数 SUM2< /代码>: sum2 <- function (x) if (length(x) == 1) { cat(x); sum(x) } else sum(x) sum2这方面的一些东西已经奏效了: sum2 <- sum sum <- function (x) if (length(x) == 1) { cat(x); sum2(x) } else sum2(x) sum2这方面的一
sum2 <- function (x) if (length(x) == 1) { cat(x); sum(x) } else sum(x)
sum2这方面的一些东西已经奏效了:
sum2 <- sum
sum <- function (x) if (length(x) == 1) { cat(x); sum2(x) } else sum2(x)
sum2这方面的一些东西已经奏效了:
sum2 <- sum
sum <- function (x) if (length(x) == 1) { cat(x); sum2(x) } else sum2(x)
sum2您需要小心这一点。所有包现在都有名称空间,并将调用同一名称空间中的其他函数。当您从主命令提示符调用函数时,您的方法可能会起作用。但是包中的函数将调用原始函数,而不是您的修改
查看assignInNamespace
和相关函数的帮助,了解在名称空间内进行更改的方法。trace
函数是修改现有函数的另一种方法,可以在现有函数中添加一些额外的代码。您需要注意这一点。所有包现在都有名称空间,并将调用同一名称空间中的其他函数。当您从主命令提示符调用函数时,您的方法可能会起作用。但是包中的函数将调用原始函数,而不是您的修改
查看assignInNamespace
和相关函数的帮助,了解在名称空间内进行更改的方法。trace
函数是修改现有函数的另一种方法,可以在现有函数中添加一些额外的代码。对于某些用途有效。但是另一个包可能会将sum
称为base::sum
,并且看不到您的定义。对于被否决的人:与其对一个在实践中适用于许多情况(即使不是所有情况)的解决方案进行否决,不如发布一个更好的解决方案?目前没有其他答案可以解决我遇到的实际问题。这一个是,所以我分享了它,而不是把问题留给别人去解决。这有一些用处。但是另一个包可能会将sum
称为base::sum
,并且看不到您的定义。对于被否决的人:与其对一个在实践中适用于许多情况(即使不是所有情况)的解决方案进行否决,不如发布一个更好的解决方案?目前没有其他答案可以解决我遇到的实际问题。这一次是这样的,所以我分享了它,而不是把问题留给别人去讨论。你指出这一点很好。你能用trace
演示如何做同样的事情吗(这个玩具示例)?实际上,如果输入值满足给定条件,我想修改函数的返回值。如果将trace
与edit=TRUE
一起使用,则可以根据需要编辑函数体。在输入语句中加入if语句,然后修改输出。这很好。但是这种编辑必须是手动的,我的目标是对函数进行编程修改。想象一下:一个包函数坏了(或者我强烈怀疑它坏了)。其他软件包使用此功能。我想在加载包之后暂时修复包函数,而不修改包源。例如,library(somePackage)
然后运行一个脚本,该脚本自动修复来自somePackage
的函数,但前提是我希望(即不永久修改包源)。@Szabolcs,您也可以使用trace
和at
参数在函数的给定位置插入表达式。有关详细信息,请参见?trace
。这比使用assignInNamespace
更简单还是更复杂很难判断。谢谢@Greg的帮助!你指出这一点很好。你能用trace
演示如何做同样的事情吗(这个玩具示例)?实际上,如果输入值满足给定条件,我想修改函数的返回值。如果将trace
与edit=TRUE
一起使用,则可以根据需要编辑函数体。在输入语句中加入if语句,然后修改输出。这很好。但是这种编辑必须是手动的,我的目标是对函数进行编程修改。想象一下:一个包函数坏了(或者我强烈怀疑它坏了)。其他软件包使用此功能。我想在加载包之后暂时修复包函数,而不修改包源。例如,library(somePackage)
然后运行一个脚本,该脚本自动修复来自somePackage
的函数,但前提是我希望(即不永久修改包源)。@Szabolcs,您也可以使用trace
和at
参数在函数的给定位置插入表达式。有关详细信息,请参见?trace
。这比使用assignInNamespace
更简单还是更复杂很难判断。谢谢@Greg的帮助!