【问题标题】:How to apply a mathematical function to a list of objects in R?如何将数学函数应用于 R 中的对象列表?
【发布时间】:2018-11-19 18:05:09
【问题描述】:

所以我有一个大的对象列表(200+),其中只包含一个数值。我想对所有这些应用相同的数学(获得 80% 的值)函数,但它不适合我。

这是一个小例子。

a = 680

b = 820

c = 1040

list = as.list(ls())

fun = function(x){x*.8}

for (i in list){
  fun(i)
}

我收到一条错误消息non-numeric argument to binary operator。我知道这可能会发生,因为该软件将函数应用于列表中的名称而不是数值,但是对于我的一生,我无法让它工作并且无法找到这个确切的问题在线的。我知道答案一定很简单,但我是新手,真的。任何帮助表示赞赏。

谢谢!!

【问题讨论】:

  • 将您的列表更改为list = mget(ls()) 而不是as.list 使用mget 然后您就可以进行所有其他操作了
  • 就是这样。我很欣赏 Jason 和 vectorson 的回答,但是在我的环境中有 200 多个元素,我不希望手动创建向量。我不知道“mget”功能。非常感谢!

标签: r list function


【解决方案1】:

你得到一个错误,因为 ls() 只返回你定义的变量的名称。 (“a”、“b”和“c”)

话虽如此,使用正则向量和标量乘法可以更轻松地完成此示例。

x = c(680, 820, 1040)
x * .8

如果出于某种原因您希望使用列表和函数,我建议您使用 lapply,如下所示:

a = 680
b = 820
c = 1040

list = list(a, b, c)

fun = function(x){ x*.8 }

lapply(list, fun)

【讨论】:

    【解决方案2】:

    使用eapply 将函数应用于环境中的所有变量。但是,我建议您首先构建一个数字变量列表并使用lapply(myList, fun),因为环境中的变量很容易被无意操纵。参考以下代码:

    ##### Solution 1 using eapply() #####
    # Build a new temporary environment to save all numeric variables
    tempEnv <- new.env()
    tempEnv$a = 680
    tempEnv$b = 820
    tempEnv$c = 1040
    
    fun = function(x){x*.8}
    
    # apply fun() to all variables in "tempEnv"
    eapply(tempEnv, fun)
    
    
    ##### Solution 2 using lapply() (Recommended) #####
    # Define all variables in a list
    myList <- list(a = 680, 
                   b = 820, 
                   c = 1040)
    
    # apply fun() to all values in myList
    lapply(myList, fun)
    

    【讨论】:

      【解决方案3】:

      您正在寻找mget 函数:这是get 的多元格式

      因此:

      a = 680
      
      b = 820
      
      c = 1040
      
      list = mget(ls())## This is the part you need to change
      
      fun = function(x){x*.8}
      
      for (i in list){
        fun(i)
      }
      

      【讨论】:

      • 就是这样!谢谢 Onyambu。还不能投票(太新了),但这是我的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2016-08-17
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多