Я нахожу, что входящий в систему Java сбивает с толку, непоследователен, плохо зарегистрированный и особенно случаен. Кроме того, существует огромная сумма подобия между этими платформами журналирования, приводящими к дублированию усилия и беспорядку относительно того, в каком входе среды Вы находитесь на самом деле. В частности, если Вы работаете в серьезной стопке веб-приложения Java, Вы часто находитесь в приблизительно регистрирующиеся среды когда-то; (например, будьте в спящем режиме, может использовать log4j и кота java.util.logging). Свободное городское население Apache предназначено для образования моста различных платформ журналирования, но действительно просто добавляет больше сложности. Если Вы не знаете это заранее, это является совершенно озадачивающим. Почему мои сообщения журнала не распечатывают к консоли и т.д.? Ohh, потому что я смотрю на журналы Tomcat, и не log4j. Добавляя еще один слой сложности, сервер приложений может иметь глобальные конфигурации входа, которые не могут распознать локальные конфигурации для конкретного веб-приложения. Наконец, все эти платформы журналирования являются СЛИШКОМ СЛОЖНЫМИ. Входя в систему Java был неорганизованным отъездом путаницы разработчики как я разбитый и запутанный.
Ранние версии Java не имели встроенного продвижения платформы журналирования к этому сценарию.
Возможно, вы захотите изменить функцию getNumberInfo
, чтобы она возвращала список, а не вектор, чтобы значения могли иметь разные типы. Как бы то ни было, все они приводятся к строкам, что, вероятно, не то, что вам нужно для logX
.
getNumberInfo <- function(x) {
if(x %% 2 ==0) evenness = "Even" else evenness="Odd"
if(x > 0) positivity = "Positive" else positivity = "NonPositive"
if (positivity == "Positive") logX = log(x) else logX=NA
list(evenness,positivity,logX)
}
Кроме того, вы можете использовать имена для несколько лучшего эффекта, чтобы не их нужно повторять:
getNumberInfo <- function(x) {
list(evenness = if(x %% 2 ==0) "Even" else "Odd",
positivity = if(x > 0) "Positive" else "NonPositive",
logX = if(x > 0) log(x) else NA)
}
Тогда решение становится простым:
> cbind(myDF, t(sapply(myDF$Value, getNumberInfo)))
Value evenness positivity logX
1 -2 Even NonPositive NA
2 -1 Odd NonPositive NA
3 0 Even NonPositive NA
4 1 Odd Positive 0
5 2 Even Positive 0.6931472
Наконец, если вы используете ifelse
(который может работать с векторами) вместо , если
, он получает четное проще, потому что вам не нужно вызывать apply
:
getNumberInfo <- function(x) {
list(evenness = ifelse(x %% 2 ==0, "Even", "Odd"),
positivity = ifelse(x > 0, "Positive", "NonPositive"),
logX = ifelse(x > 0, log(x), NA))
}
> cbind(myDF, getNumberInfo(myDF$Value))
Value evenness positivity logX
1 -2 Even NonPositive NA
2 -1 Odd NonPositive NA
3 0 Even NonPositive NA
4 1 Odd Positive 0.0000000
5 2 Even Positive 0.6931472
Это последнее решение выдает предупреждение, потому что оно фактически вычисляет журнал каждого элемента, а не только тех, у которых x> 0
. Не уверен, что самый элегантный способ справиться с этим.
Как насчет:
out <- cbind(myDF, t(apply(myDF, 1, getNumberInfo)))
colnames(out) <- c('Value', 'Evenness', 'Positivity', 'Log')
Что дает:
Value Evenness Positivity Log 1 -2 Even NonPositive NA 2 -1 Odd NonPositive NA 3 0 Even NonPositive NA 4 1 Odd Positive 0 5 2 Even Positive 0.693147180559945
Другой вариант:
> library(plyr)
> df <- mdply(myDF, getNumberInfo)
> names(df) <- c('Value', 'Evenness', 'Positivity', 'Log')
> df
Value Evenness Positivity Log
1 -2 Even NonPositive NA
2 -1 Odd NonPositive NA
3 0 Even NonPositive NA
4 1 Odd Positive 0.0000000
5 2 Even Positive 0.6931472