Как применить математическую функцию к списку объектов в R? - PullRequest
0 голосов
/ 19 ноября 2018

Итак, у меня есть большой список объектов (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 голосов
/ 19 ноября 2018

Вы получаете ошибку, потому что 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)
0 голосов
/ 19 ноября 2018

Вы ищете функцию 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)
}
0 голосов
/ 19 ноября 2018

Используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...