如果我有自己的设置(如下所示),如何将预先存在的对象(如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后尝试。