【问题标题】:Commenting multiple objects at once一次评论多个对象
【发布时间】:2011-03-19 22:56:01
【问题描述】:

假设,你有一个变量 a 到 j 的列表

for(x in 1:10) {
assign(letters[x],x)
} 

您将如何评论那些最近创建的对象?我试过类似的东西:

for(x in 1:10) { 
comment(get(letters[x])) <- paste(x)
} 

但这似乎失败了。与:

Error in comment(get(letters[x])) <- paste(x) : 
  could not find function "get<-"

我在这里缺少什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    如果你想要循环遍历一些东西,那么将它们存储在一个列表中。它让生活更轻松。但是如果你真的想这样做,你可能只需要一个 eval(parse(thingum:

    > for(i in 1:10){
    +  eval(parse(text=paste("comment(",letters[i],")<-'",as.character(i*2),"'",sep="")))
    + }
    

    【讨论】:

    • require(fortunes); fortune(106) ;-)
    【解决方案2】:

    您不能为返回的变量赋值,请参阅:

    > x <- 'cars'
    > get(x) <- 1
    Error in get(x) <- 1 : could not find function "get<-"
    

    但是使用get 可以读取/加载返回变量的注释,请参阅:

    > comment(cars) <- "test"
    > comment(get(x))
    [1] "test"
    

    您可以将变量连接到例如一个列表并注释列表的元素,例如:

    > l <- list(a=1,b=2,c=3)
    > for (x in 1:3) {
    +     comment(l[[letters[x]]]) <- paste(x)
    + }
    > str(l)
    List of 3
     $ a: atomic [1:1] 1
      ..- attr(*, "comment")= chr "1"
     $ b: atomic [1:1] 2
      ..- attr(*, "comment")= chr "2"
     $ c: atomic [1:1] 3
      ..- attr(*, "comment")= chr "3"
    

    如果您坚持使用不同的变量,只需附上给定的列表,例如:

    > attach(l)
    The following object(s) are masked _by_ '.GlobalEnv':
    
        a, b, c
    > a
    [1] 1
    > str(a)
     atomic [1:1] 1
     - attr(*, "comment")= chr "1"
    

    【讨论】:

      【解决方案3】:

      试试这个:

      # sample data
      letters <- setNames(as.list(1:10), LETTERS[1:10])
      
      for(i in 1:10) {
         temp <- letters[[i]]
         comment(temp) <- paste(i)
         letters[[i]] <- temp
      }
      

      【讨论】:

        【解决方案4】:

        另一个变体是get() 对象并将其分配给本地对象。将注释附加到该本地对象,然后将其分配回全局工作区。

        > for(x in 1:10) {
        +     assign(letters[x],x)
        + }
        >
        > a
        [1] 1
        > comment(a)
        NULL
        >
        > for(x in 1:10) { 
        +     obj <- get(letters[x])
        +     comment(obj) <- paste(x)
        +     assign(letters[x], obj)
        + }
        > ## cleanup
        > rm(obj)
        > a
        [1] 1
        > comment(a)
        [1] "1"
        

        您的代码不起作用的原因是没有get() 的替换函数版本,因此出现关于get&lt;-() 的错误消息。

        将您的对象存储在其他人提到的列表中会更容易管理,因此您不会有很多对象堵塞全局工作区,但上面显示了如何修改示例代码以达到您想要的目的。

        【讨论】:

        • 我会进一步调查列表。我目前没有使用它们,是的,当我输入 ls() 时,如果我没有为变量名提供命名法,可能会有点不知所措。
        猜你喜欢
        • 2011-12-14
        • 2015-04-01
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 2020-01-09
        • 2013-06-22
        相关资源
        最近更新 更多