使用调用更新";呼吁;R中的函数
我在理解如何在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 %*%
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)
。接受这些参数,以便在第二步中修改它们。就像makelth一样,这只是一个简单的例子。我真正的代码要复杂得多。基本上我有一个很长的参数列表,我只想修改其中一个。我必须循环使用pols(q,w,e,r,t,y,u,o,p,a,s,d,f,g,I)
因此,调用是pols(X=X,y=y,L=1)
。接受这些参数,以便在第二步中修改它们。就像makelth一样,这只是一个简单的例子。我真正的代码要复杂得多。基本上我有一个很长的参数列表,我只想修改其中一个。我必须循环使用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())