使用调用更新";呼吁;R中的函数

使用调用更新";呼吁;R中的函数,r,function,arguments,call,R,Function,Arguments,Call,我在理解如何在R中使用调用时遇到了一些困难。我想将一个由函数创建的对象用作另一个函数的参数,同时修改原始函数的一些参数。我已经看过了,但它似乎没有告诉我如何做我想做的事 这是一个我想做的部分工作的例子。首先,伪造数据: library(MASS) N <- 1000 p <- 10 A <- matrix(rnorm(p^2), p) X <- mvrnorm(N, rep(0, p), t(A) %*% A) B <- rnorm(p) y <- X %*%

我在理解如何在R中使用调用时遇到了一些困难。我想将一个由函数创建的对象用作另一个函数的参数,同时修改原始函数的一些参数。我已经看过了,但它似乎没有告诉我如何做我想做的事

这是一个我想做的部分工作的例子。首先,伪造数据:

library(MASS)
N <- 1000
p <- 10
A <- matrix(rnorm(p^2), p)
X <- mvrnorm(N, rep(0, p), t(A) %*% A)
B <- rnorm(p)
y <- X %*% B + rnorm(N)
现在,如何使用调用来驱动以下函数?它获取一个
pols
对象和一个具有不同
L
值的向量,并使用它们重新调用
pols

Lvec <- 1:10    
tryLs <- function(pols, Lvec){
      for (i in Lvec){
        1.  Extract the args from the call in pols
        2.  Modify the argument `L` based on Lvec
        3.  Run `pols` with old arguments, but `L` modified according to `i`
      }
    }
Lvec

如果我猜对了您需要什么,我会使用
pryr
包中的
partial
。这允许您创建一个已设置了多个参数的函数:

library(pryr)
preset_pols = partial(pols, X = preset_X, y = preset_y)
preset_pols(L = 1)
调用
preset\u pols
将始终使用
preset\u X
preset\u y
中指定的数据

在我看来,没有必要使用
for
循环,
lappy
在这里就可以了:

list_of_results = lapply(Lvec, preset_pols)

如果我猜对了您需要什么,我会使用
pryr
包中的
partial
。这允许您创建一个已设置了多个参数的函数:

library(pryr)
preset_pols = partial(pols, X = preset_X, y = preset_y)
preset_pols(L = 1)
调用
preset\u pols
将始终使用
preset\u X
preset\u y
中指定的数据

在我看来,没有必要使用
for
循环,
lappy
在这里就可以了:

list_of_results = lapply(Lvec, preset_pols)

我将在这里做一些猜测/假设

(1) 当您说“一个pols对象”时,您指的是由
pols
函数返回的对象。我在下面修改了
pols()
,以便它返回一个类型为“pols”的对象。这完全不是必需的,但如果您想做更有趣的事情(例如,为这些对象实现自定义打印或打印方法),这在将来可能会很有用

设置:

library(MASS)
N <- 1000
p <- 10
A <- matrix(rnorm(p^2), p)
X <- mvrnorm(N, rep(0, p), t(A) %*% A)
B <- rnorm(p)
y <- X %*% B + rnorm(N)
为了拥有
pols
对象,我们必须运行
pols()
一次并保存结果:

pols1 <- pols(X,y,0)
如果您想在更严格的级别上执行此操作(而不是使用
update
),您可以按照

pols$call$L <- new_L_value
new_result <- eval(pols$call,parent.frame())

pols$call$L我将在这里做一些猜测/假设

(1) 当您说“一个pols对象”时,您指的是由
pols
函数返回的对象。我在下面修改了
pols()
,以便它返回一个类型为“pols”的对象。这完全不是必需的,但如果您想做更有趣的事情(例如,为这些对象实现自定义打印或打印方法),这在将来可能会很有用

设置:

library(MASS)
N <- 1000
p <- 10
A <- matrix(rnorm(p^2), p)
X <- mvrnorm(N, rep(0, p), t(A) %*% A)
B <- rnorm(p)
y <- X %*% B + rnorm(N)
为了拥有
pols
对象,我们必须运行
pols()
一次并保存结果:

pols1 <- pols(X,y,0)
如果您想在更严格的级别上执行此操作(而不是使用
update
),您可以按照

pols$call$L <- new_L_value
new_result <- eval(pols$call,parent.frame())


pols$call$L因此,调用是
pols(X=X,y=y,L=1)
。接受这些参数,以便在第二步中修改它们。就像make
lth一样,这只是一个简单的例子。我真正的代码要复杂得多。基本上我有一个很长的参数列表,我只想修改其中一个。我必须循环使用
pols(q,w,e,r,t,y,u,o,p,a,s,d,f,g,I)
因此,调用是
pols(X=X,y=y,L=1)
。接受这些参数,以便在第二步中修改它们。就像make
lth一样,这只是一个简单的例子。我真正的代码要复杂得多。基本上我有一个很长的参数列表,我只想修改其中一个。我必须循环使用
pols(q,w,e,r,t,y,u,o,p,a,s,d,f,g,I)
X
y
不在全局环境中,这是必须的。@generic\u用户在这种情况下,您可以设置或预先设置环境。这里有一个例子:我真正想做的是找到避免重新指定大量参数的方法。@generic_user我不明白你的意思。添加另一个更能反映您正在处理的问题的示例可能会提供一些信息。首先,我想从通过
match.call()
保存的调用中提取参数。然后我想修改这些信息并用它来驱动函数。函数将通过调用来驱动。
X
y
不一定在全局环境中。@generic\u用户在这种情况下,您可以设置或预先设置环境。这里有一个例子:我真正想做的是找到避免重新指定大量参数的方法。@generic_user我不明白你的意思。添加另一个更能反映您正在处理的问题的示例可能会提供一些信息。首先,我想从通过
match.call()
保存的调用中提取参数。然后我想修改这些信息并用它来驱动函数。函数将通过调用来驱动。非常好,谢谢。但是我很惊讶,在base R中没有解决方案。
match.call()
如果不保存参数以供以后重新计算,那么它的意义是什么呢?您可以使用
do.call
来运行带有
参数列表的函数。只需使用一个带有预设参数的列表并附加
L=1
。非常好,谢谢。但是我很惊讶,在base R中没有解决方案。
match.call()
如果不保存参数以供以后重新计算,那么它的意义是什么呢?您可以使用
do.call
来运行带有
参数列表的函数。只需使用带有预设参数的列表并附加
L=1
。有趣。您没有使用
match.call中的信息。我想我之前的想法是,保存通话的全部目的是为了各种更新。很有趣。您没有使用
match.call中的信息。我想我的
pols$call$L <- new_L_value
new_result <- eval(pols$call,parent.frame())