【问题标题】:lapply with optional function argument and optional vector argumentslapply 带有可选函数参数和可选向量参数
【发布时间】:2019-09-20 15:17:10
【问题描述】:

我在 R 中有一个函数,比如说
f1 ...
...
...
返回(出) }

这个函数f1中的参数func0和vec分别是函数对象和一些向量对象。现在我想重复这个功能'reps'次(其他一切都一样)。我已将此函数的参数存储在一个列表中,因为有很多参数,我不断更改它们以再次进行复制。

list1

那我想做, f1_reps

执行此操作时出现错误,因为找不到函数参数 func0 和 vec。

这方面的任何帮助都会有所帮助。这是该情况的模拟示例。

这是一个例子,

a <- function(n){
  sqrt(n)
}
N = 100
out <- rep(NA,N)
# simple function with multiple arguments
foo <- function(a=a, b= c(1:3), c= 1000){
  for(n in 1:N){
    out[n] <- b%*%b+ a(n)*c
  }
  return(out)
}

candidates <- list(a=a, b = c(1:3), c=1000)
lapply(1:4, foo(a=candidates$a,b=candidates$b,c=candidates$c))  ## Doesn't work
lapply(1:4, foo, a=candidates$a, b=candidates$b, c=candidates$c) ## Doesn't work

candidates2 <- c(a=a, b = c(1:3), c=1000) # A vector of arguments
lapply(1:4, foo, a=candidates2$a, b = c(candidates2$b1,candidates2$b2,candidates2$b3), c=candidates2$c) #Doesn't work either

【问题讨论】:

    标签: r arguments simulation lapply replicate


    【解决方案1】:

    这使用dots 又名... 参数:

    foo2 <- function(...) {
    #I just returns the identity
      l <- lapply(..., I)
      a <- l[[1]]
      b <- l[[2]]
      c <- l[[3]]
    
      for(n in 1:N){
        out[n] <- b%*%b+ a(n)*c
      }
      return(out)
      }
    
    
    candidates <- list(a=a, b = c(1:3), c=1000)
    
    foo2(candidates)
    # or to simplify. Same output as previous.
    c(crossprod(1:3)) + sqrt(seq_len(100)) * 1000
    
      [1]  1014.000  1428.214  1746.051  2014.000  2250.068  2463.490  2659.751  2842.427  3014.000  3176.278  3330.625  3478.102  3619.551  3755.657
     [15]  3886.983  4014.000  4137.106  4256.641  4372.899  4486.136  4596.576  4704.416  4809.832  4912.979  5014.000  5113.020  5210.152  5305.503
     [29]  5399.165  5491.226  5581.764  5670.854  5758.563  5844.952  5930.080  6014.000  6096.763  6178.414  6258.998  6338.555  6417.124  6494.741
     [43]  6571.439  6647.250  6722.204  6796.330  6869.655  6942.203  7014.000  7085.068  7155.428  7225.103  7294.110  7362.469  7430.198  7497.315
     [57]  7563.834  7629.773  7695.146  7759.967  7824.250  7888.008  7951.254  8014.000  8076.258  8138.038  8199.353  8260.211  8320.624  8380.600
     [71]  8440.150  8499.281  8558.004  8616.325  8674.254  8731.798  8788.964  8845.761  8902.194  8958.272  9014.000  9069.385  9124.434  9179.151
     [85]  9233.544  9287.618  9341.379  9394.832  9447.981  9500.833  9553.392  9605.663  9657.651  9709.360  9760.794  9811.959  9862.858  9913.495
     [99]  9963.874 10014.000
    

    【讨论】:

      【解决方案2】:

      主要问题是您的函数f1 接受变量输入,而不是变量列表。这是您可以使用的一种方法,例如,如果我正确理解了您的输入是如何存储的

      # simple function with multiple arguments
      foo <- function(a=1, b=2, c=3){
        return(a+b+c)
      }
      
      # works
      foo(a=1, b=2, c=3)
      # doesn't work as not required format
      foo(list(a=1, b=2, c=3))
      
      # formatted list such that each element has 5 elements
      candidates <- list(
        a=1:5,
        b=2:6,
        c=3:7
      )
      
      # you need to apply the variables one by one with this setup
      N <- 5
      out <- lapply(1:N, function(i){
        foo(a=candidates$a[i]
            ,b=candidates$b[i]
            ,c=candidates$c[i])
      })
      out 
      

      【讨论】:

      • 实际上问题是我拥有的参数本身就是函数,即使我将参数存储为向量,我仍然会出错。因此,在您的示例中,假设 a= function(n){sqrt(n)}, b = 1:5, c= 1000。当这些是我每次评估时要给出的参数时,我将如何复制该函数函数。
      • 只需删除 lapply 中的[i]
      • 它似乎不起作用..根据您的公式在我的帖子中添加了一个示例。
      • 你没有按照我的例子..你对 lapply 进行了不同的编码。请在 Internet 上查找如何使用 lapply,stackoverflow 上有很多教程和内容。你也没有传递给你的功能。我建议您参加一些初学者课程,例如数据营课程。
      猜你喜欢
      • 2011-04-28
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2012-09-27
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多