将对象(DF)传递给脚本中存储的自定义函数

时间:2017-06-16 18:49:34

标签: r

如果我有自己的设置(如下所示),如何将预先存在的对象(如DF)传递给我的自定义函数? 或者,我是否需要以不同方式设置自定义函数?

我的函数驻留在一系列* .R脚本中。 我在.Rprofile中输出函数:

.env$fxShortName <- function(){
source("C:\\path\\to\\scriptFile.R")
}

非常好的解决方案:

1)手动定义功能||它的工作原理很明显,我每次都需要手动加载我的功能 2)Rscript + commandArgs ||如果我在函数中定义DF,这可以工作,如下所示:

#foo.R
a <- data.frame(a = c(1))
b <- data.frame(b = c(1))
args <- commandArgs(trailingOnly = TRUE)
print(args)
data.frame.name <- args[1]
print(colnames(get(data.frame.name)))

但是,Rscript会创建一个新的R实例,因此它不会看到我预先存在的DF。至少,它没有发现它的开箱即用 3)具有替换,match.call等功能。||我已采用%&gt;&gt;%来设置某些DF的自动更新视图,因此我尝试修改在这种情况下有效的设置。对于%&gt;&gt;%,我的.Rprofile中包含此代码:

.env$`%>>%` <- function(expr, x) {
x <- substitute(x) 
call <- match.call()[-1] 
fun <- function() {NULL} 
body(fun) <- call$expr 
makeActiveBinding(sym = deparse(x), fun = fun, env = parent.frame())
invisible(NULL)
}

此类设置适用于当前会话中的DF。但是,我更喜欢通过将我的自定义脚本与我的.Rprofile分开来提供的结构。

4)get()&amp; mget()||这似乎很有希望,但我不明白它是否足以明确地说它是否会有所帮助。而且,是的,我做了RTFM。

可重复的例子:

myfx(head, preExistingDF)

示例代码:

myfx <- function(expr, x) {
x <- substitute(x)
call <- match.call()[-1]
fun <- function() {NULL}
body(fun) <- call$expr
print(body(fun))}

将示例代码放在脚本中。将以下代码添加到.Rprofile:

.env$mySamplefx <- function(){
source("C:\\path\\to\\myfx.R")
}

然后在将代码直接添加到.Rprofile后尝试。

0 个答案:

没有答案