【问题标题】:How to import a file in R and give it a name如何在 R 中导入文件并为其命名
【发布时间】:2019-11-01 18:49:07
【问题描述】:

我有一个如下所示的 R 类

source("data_validation.R")

data_validation.mymodel <- function(mymodel,newdata=list()) {

  data_validation(newdata)
}

我有一个名为data_validation 的函数,我需要从另一个文件中调用另一个函数,该文件是同名文件。但它给了我一个错误,因为它具有相同的名称,所以在另一个文件中找不到该函数。如何在data_validation.R 文件中为我的函数设置别名,以便我可以轻松区分这两个函数(即类似于 python 的东西,我可以说 import data_validation as dv)

【问题讨论】:

  • “来自另一个文件的函数...同名” 除非它们被加载到不同的命名空间/环境中,否则不会发生。可以区分(例如)lag 和包statsdplyr 的原因是通过双冒号引用:stats::lagdplyr::lag。如果将同名函数加载到命名空间中,则每次都会覆盖该命名空间中的旧版本。
  • 双冒号仅适用于包,不适用于我使用源导入的文件,对吗?
  • 是的,这就是为什么 sourceing from files 没有让您有机会在加载第二个时覆盖。
  • 所以在这种情况下没有选项?
  • 我已经多次寻找模仿 python 的import pandas as pd 的解决方案,但什么都没有。

标签: r


【解决方案1】:

只要你:

  1. 必须source文件,至少其中一个是正式的包;和
  2. 无法更改在这些源文件中定义的任何一个函数的函数名称,

您必须解决一些问题才能同时使用这两个功能。

这里有一个可能对你有用的技巧。

  1. 我从一个简单的文件开始,foo.R,它只定义了一个函数:

    myfunc <- function(x) x+1
    
  2. 在全局环境下,我加载测试一下:

    source("~/Downloads/foo.R")
    myfunc(2)
    # [1] 3
    
  3. 但是假设我有另一个文件 (foo2.R) 具有相同的功能:

    myfunc <- function(x) x+1000
    
  4. 让我们围绕源代码编写一个包装器,只查找该函数:

    wrap_source <- function(...) { source(..., local = TRUE); environment(); }
    
    ls(envir=wrap_source("~/Downloads/foo2.R"))
    # [1] "myfunc"
    
    other <- wrap_source("~/Downloads/foo2.R")
    myfunc(1)
    # [1] 2
    other$myfunc(1)
    # [1] 1001
    

【讨论】:

  • 有什么想法吗,HHH?我知道这并不能真正解决您当前的问题,但我不知道有任何构造允许这样做而不涉及显式的模块/包式命名空间。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多