【问题标题】:How do you stop source from abbreviating function names?如何阻止 source 缩写函数名称?
【发布时间】:2012-09-14 14:59:37
【问题描述】:

我正在尝试获取多个功能,它们的名称中的数字不同。

例如:func1、func2。

我尝试使用“func_1”和“func_2”,以及将数字放在第一位,“1func”和“2func”。无论我如何索引函数名称,源函数只会读取一个它调用的函数"func" - 这不是我想要的。

我尝试过使用 for-loops 和 sapply:

for循环:

func.list <- list.files(path="/some_path",pattern="some pattern",full.names=TRUE)
for(i in 1:length(func.list)){
source(func.list[i])
}

申请:

sapply(func.list,FUN=source)

我将编写数据校正函数的多个版本,并且非常希望能够对它们进行索引 - 因为给出一个简洁但具体的名称会很困难,并且不允许我有选择地仅获取功能文件从他们的目录。

在我的代码中,func.list 给出了输出(由于隐私/合同问题,我已经替换了实际目录):

[1] "mypath/1resp.correction.R" 
[2] "mypath/2resp.correction.R"

然后,当我使用 for-loop 或 sapply 代码(如上所列)获取 func.list 时,R 仅加载一个名为 resp.correction 的函数,其代码主体来自“2resp.correction.R”。

【问题讨论】:

  • 这听起来不像标准的源行为,请让您的 example.reproducible。
  • 你当然不能把数字放在前面,比如1func——这不是R(或大多数语言)中的合法标识符。
  • @David Robinson:感谢您的意见。为了进一步澄清,我尝试使用以下格式(没有成功):“func1”、“func_1”和“1func”。
  • @Paul Hiermstra 我尽力编辑代码,以使示例可重现。我不确定我还能做什么。

标签: r function abbreviation


【解决方案1】:

source 的参数是文件名,而不是函数名。所以你不能在这里花哨:你需要提供确切的文件名。

听起来您的两个文件在两个文件中都包含同名 (resp.correction) 函数的定义,所以是的,当您一个接一个地获取文件时,该函数会在您的全局环境中被覆盖。

您可以在循环中将函数重新分配给不同的名称:

func.list <- list.files(path="/some_path",pattern="some pattern",full.names=TRUE)
for(i in 1:length(func.list)) {
   source(func.list[i], local = TRUE)
   assign(paste0("resp.correction", i), resp.correction, envir = .GlobalEnv)
} 

【讨论】:

  • 非常感谢!我现在意识到我没有更改文件中的函数名称。我觉得自己像个大白痴,但再次感谢你。
猜你喜欢
  • 2012-10-18
  • 2023-03-13
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多