r - R 中函数内嵌套变量的 For 循环

标签 r function for-loop montecarlo

我想在 R 的函数环境中迭代值向量并为每个值计算一些值。例如:

# I have costs for 3 companies
c <- c(10, 20, 30)
# I have the same revenue across all 3 
r <- 100
#  I want to obtain the profits for all 3 within one variable
result <- list()

# I could do this in a for loop
for(i in 1:3){
    result[i] <- r - c[i]
}

现在假设我有一个很长的模型,并且我将所有内容定义为一个函数,该函数将通过各种随机抽取成本来解决。

# Random draws
n  <- 1000
r  <- rnorm(n, mean = 100,  sd = 10)
c1 <- rnorm(n, mean = 10,  sd = 1)
c2 <- rnorm(n, mean = 20,  sd = 2)
c3 <- rnorm(n, mean = 30,  sd = 3)
X  <- data.frame(r, c1, c2, c3)

fun <- function(x){
       r  <- x[1]
       c  <- c(x[2], x[3], x[4])

       for(i in 1:3){
           result[i] <- r - c[i]
       }
  return(result)
}

然后,我可以通过迭代随机采样的输入数据行来评估所有抽奖的结果。

for(j in 1:n){
  x <- X[j,]
  y <- fun(x)
}

在此示例中,输出变量 y 将包含嵌套结果变量,其中包含所有 3 个公司的结果。但是,我的思路导致了错误,我认为这与我尝试返回嵌套变量有关?因此我的问题是你们会如何处理这样的事情。

最佳答案

我建议重新考虑您的编码方法。这是一种非常不像 R 的做事方式。

例如,第一个 for 循环可以更简洁地写为

x <- c(10, 20, 30)
r <- 100
result <- lapply(-x, `+`, r)

然后fun就变成了这样的东西

fun <- function(x) lapply(-x[-1], `+`, x[1])

要对 data.frame 的行进行操作(这似乎是您在最后一步中所做的),您可以使用类似的内容

apply(X, 1, fun)

其中 apply 中的 MARGIN = 1 参数确保您在每行(而不是每列)应用一个函数。

关于r - R 中函数内嵌套变量的 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52274081/

相关文章:

r - 对于来自 {Matrix} 的稀疏矩阵,是否有 R 函数 duplicated() 的方法?

javascript - 允许 javascript 函数接受任意数量的参数

arrays - 在接收函数返回数组时执行错误的过量操作?

r - 使用 for 循环将交易列表中的值放入稀疏矩阵中

r - 不同长度向量的箱线图

r - 没有 NA 的连续事件数

python - 如何使用 Python 获取用户输入的确切数量?

java - 如何创建我自己的简单 indexOf() 方法

将 NA 替换为 r 中每个组的同一列另一行中的值

sql - 识别何时在 SQL 查询或 PL/SQL 过程中执行函数