【问题标题】:How to import an .R file and assign an alias to it? Like import myfile.R as mf如何导入 .R 文件并为其分配别名?就像 import myfile.R as mf
【发布时间】:2019-08-26 12:55:45
【问题描述】:

这里是R初学者,真的很怀念Python的

import pandas as pd
import my_file_which_is_just_a_file_not_a_package as mf
out = mf.my_cool_function()

我找到了一种实现类似于前者的方法(为包分配别名),但如何执行后者,即如何为.R文件(不是包)分配别名您正在导入? 例如您已将一些经常使用的函数放入单独的 .R 文件中,或者您将程序分成多个 .R 文件以保持整洁。

注意:这不是询问如何为包分配别名的问题的重复 - 我说的是单个 R 文件,而不是包。

我了解命名空间库为已安装的软件包提供了类似于 import as 的功能:

library(namespace)
registerNamespace('ggp', loadNamespace('ggplot2'))
data(iris)
ggp::ggplot(iris, ggp::aes(x = Petal.Length, y = Sepal.Length)) + ggp::geom_point()

我也知道您可以使用 import 仅从另一个 .R 文件中导入某些函数,例如从另一个脚本(不是包):

import::here(fun_a, fun_b, .from = "other_resources.R")
a <- fun_a(…)

最后,您可以使用source 加载另一个脚本。

但这些都没有解决我关于使用别名导入的观点。

编辑

因为有人问我,我正在尝试学习一些 R,因为:

  • 我很好奇;我上次尝试 R 是在 tidyverse “革命”之前;当时我讨厌它,觉得它晦涩难懂,而且文档极差。每个人都在说 tidyverse 有多棒,所以我很想再试试 R
  • 我不太可能将我的所有工作流从 Python 迁移到 R,但我可能希望在 R 中做某些事情。例如读取大型 Excel 文件并导出到 SQL;这两个任务在 R 中都快得多。我现在可以在很短的时间内将大型 xlsx 文件导入 SQL,然后让 Python 从 SQL 中读取,并保持我的工作流程的其余部分不变。我在here 发布了关于它的信息,我还解释了为什么 CSV 不是我的最佳选择(请不要回复说“使用 CSV”)。

【问题讨论】:

  • 为什么需要这样做?只需导入包(它根本不会减慢您的系统速度),然后使用所需的任何功能。无需只导入ggplot2 的一部分。您安装、调用它,然后使用您需要的任何功能。对于包或文件,不需要别名
  • 我不同意。没有别名,我如何确定没有名称冲突?如果在多个包中以不同方式实现相同的功能怎么办?即使没有冲突,调用 al.fun() 也是对 fun() 来源的有用提醒。请问您对其他语言的熟悉程度如何?我发现这个概念对于 R 和 Matlab 用户来说是陌生的(它们的命名空间实现很糟糕),而对于其他语言的用户来说似乎很常识。
  • 顺便说一句,我的问题是关于 R 脚本,而不是包。在 Python 中,计算某些东西的函数可能在多个包中可用,有几次我在单独的文件(不是包)中构建了自己的版本。能够调用 this_package.calc()、that_package.calc()、myfile.calc() 然后比较结果对我来说非常有用。例如,我构建了一个特定的函数来解决一些数字问题,就我而言,这比常用的包要快得多。
  • @Pythonistaan​​onymous ;从链接中,我尝试类似:如果您的 R 函数存储在 temp 中:txt = 'fun &lt;- function(...) print("hello")' ; cat(txt, file=temp&lt;-tempfile()),您可以将它们加载到环境 source(temp, local = my_alias&lt;-new.env()) 中。然后使用my_alias$fun() 调用该函数。 (但我的 2c fwiw,只是把函数放在一个包中)

标签: r namespaces


【解决方案1】:

听起来您想定义一个环境并将文件导入其中。我发现 sys.source 对此很有用。

我有一个名为“my_test_script.R”的示例文件,其中包含:

MYCONSTANT <- 3

testfun <- function(val){
  print(val)
}

testfun2 <- function(x){
  return(x + MYCONSTANT)
}

现在是一个将文件读取到环境中的示例会话,因此我可以将其中的信息“别名”为“tstEnv”:

> tstEnv <- new.env()
> sys.source(file = "my_test_script.R", envir = tstEnv, toplevel.env = tstEnv)
> tstEnv$testfun("it works")
[1] "it works"
> tstEnv$testfun2(0) 
[1] 3
> tstEnv$testfun2(1)
[1] 4
> tstEnv$MYCONSTANT # I can read my constants too
[1] 3

【讨论】:

  • 谢谢!这与@user20650 提出的解决方案有何不同?有什么根本区别吗?
  • 老实说 - 我不记得 toplevel.env 参数是否完全必要。
  • @Pythonistaan​​onymous - 我没有看到其他答案。我没有阅读问题的 cmets,所以也许是一样的?
  • @Pythonistaan​​onymous 链接问题中的答案是我很确定我在我的系统上保存的代码的模板。看起来这个问题实际上可能是作为重复关闭的候选人。
  • 他的语法是:source(temp, local = my_alias&lt;-new.env())。请不要将其作为重复项关闭。另一个问题没有明确解决如何将脚本作为别名导入。对于有经验的 R 用户来说,这听起来很明显,但对于来自其他语言的人来说,这不是!
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 2019-04-23
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多