代码之家  ›  专栏  ›  技术社区  ›  dnagirl

用法:如何将列表的name属性传递到函数中?

  •  12
  • dnagirl  · 技术社区  · 14 年前

    假设我有这样一个R列表:

    > summary(data.list)
                                     Length Class      Mode
    aug9104AP                        18     data.frame list
    Aug17-10_acon_7pt_dil_series_01  18     data.frame list
    Aug17-10_Picro_7pt_dil_series_01 18     data.frame list
    Aug17-10_PTZ_7pt_dil_series_01   18     data.frame list
    Aug17-10_Verat_7pt_dil_series_01 18     data.frame list
    

    我要处理每个data.frame 在列表中使用 l_ply ,但我还需要将名称(例如aug9104AP)与数据框. 比如:

    l_ply(data.list,function(df,...) {
    
        cli.name<- arg_to_access_current_list_item_name
    
        #make plots with df, use cli.name in plot titles
        #save results in a file called cli.name
    
      }, arg_to_access_current_list_item_name
    )
    

    你应该做什么 arg_to_access_current_list_item_name 是吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Joris Meys    14 年前

    如果您逐个传递它们,可以使用deparse(替换(arg)),例如:

    test <- function(x){
           y <- deparse(substitute(x))
           print(y)
           print(x)
     }
    
     var <- c("one","two","three")
     test(var)
    [1] "var"
    [1] "one"   "two"   "three"
    

    for(i in 1:length(data.list)){
        attr(data.list[[i]],"name") <- names(data.list)[i]
    }
    

    然后可以使用attr:

    cli <- attr(x,"name")
    

    干杯

        2
  •  11
  •   Collin    14 年前

    最简单的方法是从名称开始,然后使用它们提取您感兴趣的部分:

    l_ply(names(data.list),function(name,...) {
      df <- data.list[[name]]
    )
    

    你也可以使用 m_ply 要同时传入名称和数据:

    m_ply(cbind(names(data.list), data.list), function(name, df, ...) {
       ...
    }
    
        3
  •  3
  •   Community CDub    8 年前

    Joris 答案是最干净的方法。我将添加一个函数来提取属性:

    for(ename in names(data.list)) {
        attr(data.list[[ename]], "ename") <- ename
    }
    ename <- function(x) attr(x, "ename") # states for element name
    

    l_ply(data.list, function(df, ...) {
        cli.name<- ename(df)
        # make plots, save results using cli.name
    })
    

    我通常使用这种方法:

    l_ply(names(data.list), function(cli.name, df=data.list[[cli.name]], ...) {
        # make plots, save results using cli.name
    })
    

    迭代名称并提取 data.frame


    只是为了通知有黑客。我不建议这样做,因为它会弄乱画面,很难控制。
    利用事实 llply 实际上是一个 for 循环可以从函数内部提取实际步骤。可以使用 get 有正确的环境。

    l_ply(data.list, function(df, ...) {
        cli.name<- names(data.list)[get("i",parent.frame())]
        # make plots, save results using cli.name
    })