【问题标题】:*apply in r to repeat a function*在 r 中应用以重复一个功能
【发布时间】:2013-01-24 20:00:23
【问题描述】:

我编写了一个模拟函数,它输出一个包含 100 个元素的向量,我想使用 *apply 函数多次运行该函数,并将每次重复的输出存储在一个新向量中运行模拟。

函数如下:

J <- c(1:100)
species_richness <- function(J){
   a <- table(J)
   return(NROW(a))
}

simulation <- function(J,gens,ploton=FALSE,v=0.1){
    species_richness_output <- rep(NA,gens)
    for(rep in 1:gens){
        index1 <- sample(1:length(J),1)

        if(runif(1,0,1) < v){
           J[index1] <- (rep+100)
        } 
        else{
           index2 <- sample(1:length(J),1)
           while(index1==index2) {
               index2 <- sample(1:length(J),1)
           }
           J[index1] <- J[index2]
        }
        species_richness_output[rep] <- species_richness(J)
    }

    species_abundance <- function(J){
       a <- table(J)
       return(a)
    }

    abuntable <- species_abundance(J)
    print(abuntable)

    octaves <- function(abuntable){
       oct <- (rep(0,log2(sum(abuntable))))

       for(i in 1:length(abuntable)){
          oct2 <- floor(log2(abuntable[i])+1)
          oct[oct2] <- oct[oct2]+1
       }

       print(oct)
    }   

    # octaves(c(100,64,63,5,4,3,2,2,1,1,1,1))


    if(ploton==TRUE){
       hist(octaves(abuntable))
    }
    print(species_richness(J))

    return(J)
}

simulation(J, 10000,TRUE,v=0.1)

这就是我的函数,它接受 J 一个我之前定义的向量,对其进行操作,然后返回: 新模拟的 100 个元素的向量 J 一个名为 octave 的函数,用于对新向量进行分类 对应上述“八度”的直方图

我尝试了多种变体:使用lapplymapplyargs=args_from_original_simulation

simulation_repeated <- c(mapply(list, FUN=simulation(args),times=10000))

但我不断收到 mapply 函数的 match.fun 部分的错误

Error in match.fun(FUN) : 
  'simulation(J, 10000, FALSE, 0.1)' is not a function, character or symbol

尽管我编写的模拟显示为在工作区中保存为函数。

有谁知道这个错误指向什么?

【问题讨论】:

  • 也许replicate 更接近您要查找的内容...?
  • 您提供的示例代码看起来 FUBAR。您的args 是否从一个模拟变化到另一个模拟?如果没有,那么jorans 的想法是正确的。
  • r*ply 来自ddply
  • 我还建议您避免使用像args 这样的关键函数名称来命名变量。如果您提供更多信息,例如 simulation 函数和 args 的主体,您将获得更多具体的答案。
  • 我之前在将参数传递给其中一个 pply 函数时遇到了该错误。通常,如果您将整个主体包裹在一个匿名函数中,那么它就可以工作。

标签: r


【解决方案1】:

在这一行:

simulation_repeated <- c(mapply(list, FUN=simulation(args),times=10000))

你没有提供一个函数来映射。您(本质上)传递了调用simulation(args) 的结果,而simulation 不返回函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多