如何在 R 中导入文件并为其命名

Posted

技术标签:

【中文标题】如何在 R 中导入文件并为其命名【英文标题】:How to import a file in R and give it a name 【发布时间】: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 的解决方案,但什么都没有。 【参考方案1】:

只要你:

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

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

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

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

    myfunc <- function(x) x+1
    

    在全局环境下,我加载测试一下:

    source("~/Downloads/foo.R")
    myfunc(2)
    # [1] 3
    

    但是假设我有另一个文件 (foo2.R) 具有相同的功能:

    myfunc <- function(x) x+1000
    

    让我们围绕源代码编写一个包装器,只查找该函数:

    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?我知道这并不能真正解决您当前的问题,但我不知道有任何构造允许这样做而不涉及显式的模块/包式命名空间。

以上是关于如何在 R 中导入文件并为其命名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中导入 CSV 文件? [关闭]

如何更新/覆盖当前在 R 中导入的 csv 文件

如何在 Python 中导入 COM 对象命名空间/枚举?

如何在 terraform 中导入生成的 Kubernetes 集群的命名空间

如何在 R 中导入和合并多个文件?

如何在R中导入CSV文件? [关闭]