【问题标题】:Include source code to function from external file in R在 R 中包含从外部文件运行的源代码
【发布时间】:2013-02-20 14:29:32
【问题描述】:

我有一个标准的数据分析程序,需要在各种(约 50 个数据集)上运行。我已经开发了一段时间,现在我想把它变成一个函数,它接受一个数据集并为每个数据集吐出一些合理的表。然而,完成的过程跨越了四个脚本文件,到目前为止我已经使用source从一个到另一个运行它,但似乎function似乎是不可能的。

我有以下问题:

foo <- function(data) {
  a <- somevariable
  source("..somefile..") #The code in there uses a, but a is not in the workspace...
  ..
  continue
  ..
}

代码在数据集上运行时崩溃。

是否有某种方式(命令)可以在编译时从其他文件中复制粘贴命令(不知道如何以不同的方式调用它,即使它不是真正的编译)函数?我知道我可以自己复制粘贴它,但我不想这样做,因为各种步骤包括神经网络和 ARFIMA 估计,为了代码的可读性,我想将它们保存在单独的文件中。无论如何,复制粘贴后的功能将类似于 200 行代码,这绝对不是用户友好的...

谢谢

【问题讨论】:

  • 为什么不把你当前source的文件作为函数的参数呢?听起来您确实已经接近需要开始将事物形式化为执行特定任务的函数的地步,并且可能从中构建一个小包(或者至少获取所有函数,然后在其他函数中使用它们)。
  • 不,它只是一个目的的代码,制作包没有用,我已经做了一个很大的包来做这个分析。 ;) R 中是否存在仅包含一些编译文本的函数?
  • 我不完全确定您所说的“仅包含一些关于编译的文本”是什么意思。当然有些函数包含要传递给另一个函数的文本块,或者将文本块写入文件,如 html 文件。
  • 啊,你有一个范围界定问题比什么都重要。 ..some file.. 需要编写为函数,以便可以替换参数并且不必在所有上下文中具有相同的名称。很明显,源函数的环境与调用函数的环境不同,否则你不会得到你所做的错误。修复环境问题将比硬着头皮将源脚本重写为函数更费力,也更容易出错。
  • 我想另一种选择是将所有内容放在Rnw 文件中并使用sweaveknitr 进行分析(无需采购,只需在代码块中包含完整代码)。如果重要的话,这样做的好处是能够写出漂亮的报告和图表。

标签: r scoping reproducible-research


【解决方案1】:

我建议从一个最小的示例开始,以便您了解编写函数需要什么、如何使用 source() 将函数加载到 R、如何使用参数以及如何调用函数。在这样做之后,希望下一步去哪里会更加明显。

要回答您的问题,如果您的脚本包含 200 行代码并且只执行一件事(即执行一个 FUNCTION),那么您应该考虑将其包装到一个函数中,是的。这实际上会增加而不是降低用户友好性,因为您的脚本现在只能包含一行(函数调用),而不是原来的 200 行代码。

【讨论】:

  • 是的,我可以将它重写为一个函数,但这需要很多时间,我想知道是否存在只包含文本的命令?
  • 我认为一旦你知道如何并且这是你想要学习的技能 :) 将花费很多时间,但是 source() 是你用来运行另一个代码的工具如果您认为这更容易,请在您的函数中添加文件。
【解决方案2】:

我猜是这样的:

myfunc <- function() {
if (something) source("path to script")
} else {
if (another thing) source("path to another script")
}
Do calcs and return the result
}

或者脚本的路径可以是函数参数。

【讨论】:

    【解决方案3】:

    我理解你的问题,我假设你想使用函数source在函数中使用proc,所以你只需要添加参数local = T

    示例

    #This is your source code
    y<-x+1
    #save in your favorite path as "your_path.R"
    
    #Function where you will call the above code
    your_function<-function(x){
    source("your_path.R",local=T) #plus 1 to x. IMPORTANT: local=T
    return(y)
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 2020-09-16
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多