如何将数学函数应用于R中的对象列表?

时间:2018-11-19 18:05:10

标签: r list function

因此,我有大量的对象(超过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。我知道这可能是由于软件正在将函数应用于列表中的名称而没有数字值而发生的,但是对于我一生来说,我无法使其正常工作,并且无法找到确切的问题线上。我知道答案一定很简单,但我确实是个新手。任何帮助表示赞赏。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用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)

答案 1 :(得分: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 :(得分:0)

您正在寻找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)
}