代码之家  ›  专栏  ›  技术社区  ›  Roman LuÅ¡trik

在自定义函数中存储的值

  •  2
  • Roman LuÅ¡trik  · 技术社区  · 14 年前

    我的程序用一个data.frame来处理数字。在某一点上,第j列中的值乘以取决于列名的预定义值(物种名称,实际上是生态索引)。到目前为止,我已经通过匹配列名通过第二个data.frame提供了这些值。在函数中集成固定变量值的有效方法是什么?我希望我的程序尽可能的便携,而不需要第二个data.frame文件。

    编辑

    这就是功能。我正在尝试改进第二行(index<-read.table…),以便它不依赖外部源。

    macroIndex <- function(obj, index) {
        index <- read.table("conv.csv", header=T, dec=",")
        a <- c()
        b <- names(obj)
        for (i in 2:length(obj)) {
            obj[i] <- obj[i] * index[which(index==b[i]), 2]
        }
        obj
    }
    

    我尝试了另一个解决方案,虽然看起来不太好,但它完成了任务。我使用dput(index)并创建一个永久对象,然后将其插入到函数中。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Shane    14 年前

    好吧,您需要将列名映射到另一个值,所以必须以某种方式存储它。我想说一个命名列表是一个更合适的数据结构,尽管在一天结束的时候它并没有什么大的区别。

    以下是一些示例数据:

    df <- data.frame(a=1:5, b=2:6)
    mapping <- list(a=3, b=4)
    

    下面是一个使用列表的简单示例:

    for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]]
    

    关于tal使用矩阵的建议:只要数据帧中的每个值都是相同类型的,那么这是正确的。如果有混合类型,则需要使用数据帧。

        2
  •  1
  •   Ian Fellows    14 年前

    可以使用r的词法范围来定义函数 function_maker 返回所需函数的 func . 创建映射向量的代码仅在以下情况下调用 功能制造商 是被叫的,不是什么时候 芬克 是。 mapping 也属于 芬克 因为代码的其他部分不能改变它。

    dat <- data.frame(a=c(1,2,3),b=c(3,2,0),c=c(5,6,4))
    
    function_maker <- function(){
        mapping <- c(a=4,b=2,c=5)
        function(df){
            for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]]
            return(df)
        }
    }
    
    func <- function_maker()
    
    func(dat)
    
        3
  •  1
  •   PaulHurleyuk    14 年前

    为什么不将第二个数据帧作为参数包含到函数调用中,然后检查它是否已给定,如果没有,则手动创建它,这样代码就可以用于与当前所做操作相匹配但可以更改为与新数据集相匹配的数据集。

    例如(抱歉,我不在我的电脑旁,所以这是未经测试的)

    macroIndex <- function(obj, index) {
      if(!exists(index)) {
        index <- data.frame(# contents of the default data frame here )
      }
      a <- c()
      b <- names(obj)
      for (i in 2:length(obj)) {
          obj[i] <- obj[i] * index[which(index==b[i]), 2]
      }
      return(obj)
    }
    
        4
  •  0
  •   Tal Galili    14 年前

    1)考虑移动到matrix而不是data.frame-以获得更快的结果。

    2)你能提供一些简单的代码来解释你想要实现什么吗?