代码之家  ›  专栏  ›  技术社区  ›  MHeydt

使用trace在R中编辑函数?

  •  4
  • MHeydt  · 技术社区  · 6 年前

    我注意到我想要使用的包中的函数中有一个bug。GitHub上出现了一个问题,但创建者还没有解决这个问题,我需要尽快使用这个函数。

    因此,我想编辑代码。显然,这可以通过编辑源代码、重新打包和安装整个包来实现,我可以重写函数并重新分配名称空间,但也可以通过在当前会话中使用 trace()

    我已经发现我可以做到:

    as.list(body(package:::function_inside_function))
    

    我要编辑的行位于 第二 函数的步骤。

    具体来说,它是 this line 在我需要编辑的代码中。我得换衣服 ignore.case ignore.case=TRUE 。链接失效的示例:

    functionx(){if{...} else if(grepl("miRNA", data.type, ignore.case)) {...}}
    

    我还没有找到一个实际的例子来说明如何从这里开始,所以有人能给我一个例子来说明如何做到这一点,或者给我一个使用trace的实际例子吗?或者将函数重新分配给名称空间?

    2 回复  |  直到 4 年前
        1
  •  2
  •   RolandASc    6 年前

    对于您的具体情况,您可能确实可以使用 trace

    从你提供的链接我不知道你为什么说 函数中的函数 ,但这应该是可行的:

    # example
    trace("grepl", tracer = quote(ignore.case <- TRUE))
    
    grepl("hi", "Hi")
    ## Tracing grepl("hi", "Hi") on entry 
    ## [1] TRUE
    
    # your case (I assume)
    trace("readTranscriptomeProfiling", tracer = quote(ignore.case <- TRUE))
    

    注意,如果参数 ignore.case 您要修复的在呼叫中的位置不正确。

        2
  •  2
  •   gfgm    6 年前

    我曾经遇到过类似的问题,并使用 assignInNamespace() 。我没有安装你的软件包,所以我不能确定这是否适合你,但我认为应该这样。您将按以下步骤进行:

    生成所需功能的编辑版本:

    # I would just copy the function off github and change the offending line
    readTranscripttomeProfiling <- function() {"Insert code here"}
    
    # Get the problematic version of the function out of the package namespace
    tmpfun <- get("readTranscripttomeProfiling", 
                   envir = asNamespace("TCGAbiolinks"))
    
    # Make sure the new function has the environment of the old 
    # function (there are possibly easier ways to do this -- I like 
    # to get the old function out of the namespace to be sure I can do 
    # it and am accessing what I want to access)
    environment(readTranscripttomeProfiling) <- environment(tmpfun)
    # Replace the old version of the function in the package namespace
    # with your new version
    assignInNamespace("readTranscripttomeProfiling", 
                       readTranscripttomeProfiling, ns = "TCGAbiolinks")
    

    我在另一个StackOverflow响应中找到了此解决方案,但目前似乎找不到原始解决方案。