Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有可能;“包装”;一个R函数来修正它的功能?_R_Metaprogramming - Fatal编程技术网

有没有可能;“包装”;一个R函数来修正它的功能?

有没有可能;“包装”;一个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这方面的一

是否可以包装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 <- 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的帮助!