SOLVED Загрузка пакетов по LAPPLY не соответствует функции REQUIRE [duplicate]

У меня была такая же проблема, потому что моя строка кода была:

txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");

Я перехожу к этому, читая предыдущий ответ, потому что я не писал десятичную точность:

txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");

4 - Десятичная точность

И RoundingMode являются константами Enum, вы можете выбрать любой из этих UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP

. В этом случае HALF_UP будет иметь следующий результат:

2.4 = 2   
2.5 = 3   
2.7 = 3

Вы можете проверить информацию RoundingMode здесь: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/

133
задан MBorg 1 March 2018 в 10:37
поделиться

8 ответов

Несколько перестановок ваших предложенных функций работают, но только если вы указываете аргумент character.only как TRUE. Быстрый пример:

lapply(x, require, character.only = TRUE)
181
ответ дан daroczig 15 August 2018 в 15:45
поделиться
  • 1
    @Tommy & amp; daroczig - Круто. Это гораздо более чистое решение. Я оставлю свой только для потомков, и для чего он показывает, почему попытки OP не работали. – Josh O'Brien 18 November 2011 в 02:22
  • 2
    Вы можете использовать частичное совпадение символов и уйти с lapply (x, require, ch = T) или даже lapply (x, require, c = T) – Dason 18 November 2011 в 06:22
  • 3
    @daroczig Этот код загружает пакеты, но почему он дает следующие предупреждающие сообщения: 1: В библиотеке (пакет, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE:: нет пакета, называемого 'x' 2: In if (! loaded) {: условие имеет длину & ​​gt; 1, и будет использоваться только первый элемент – Anusha 1 November 2012 в 15:48
  • 4
    @Anusha: Я понятия не имею ATM, что у вас в вашем x? – daroczig 1 November 2012 в 16:54
  • 5
    Будьте здоровы, если R :: base добавил этот lapply трюк, родной к library(). Будьте здоровы, чтобы сказать: library(c("plyr", "umx")) – tim 28 June 2015 в 18:56

для тех, кто хочет установить и загрузить пакеты одновременно, я наткнулся на эту функцию в ссылке ниже https://gist.github.com/stevenworthington/3178163

# ipak function: install and load multiple R packages.
# check to see if packages are installed. Install them if they are not, then load them into the R session.

ipak <- function(pkg){
new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
if (length(new.pkg)) 
    install.packages(new.pkg, dependencies = TRUE)
sapply(pkg, require, character.only = TRUE)
}

# usage
packages <- c("ggplot2", "plyr", "reshape2", "RColorBrewer", "scales", "grid")
ipak(packages)
10
ответ дан bala 15 August 2018 в 15:45
поделиться
  • 1
    Привет, я создал файл R из вашего данного фрагмента. Когда я запускаю этот сценарий в службе Amazon EMR, он дает мне следующий вывод, как указано в следующем URL-адресе. pastie.org/10402378#3,10-11,13 . – Rubin Porwal 7 September 2015 в 07:07

Вы можете просто использовать пакет lubripack, и он аккуратно устанавливает новые пакеты, а затем загружает их все в одну строку.

lubripack («plyr», «psych», «tm»)

Вот результат после запуска над кодом в RStudio.

Как установить пакет:

Запустить ниже кода для загрузки пакета и установки его из GitHub. Нет необходимости иметь учетную запись GitHub.

library(devtools)
install_github("espanta/lubripack")
4
ответ дан Espanta 15 August 2018 в 15:45
поделиться
  • 1
    почему голос? Пожалуйста, помогите мне понять это. – Espanta 23 April 2016 в 19:07
  • 2
    Я бы предпочел использовать изображения вместо текста – The Unfun Cat 3 May 2016 в 06:32
  • 3
    Это также не отвечает на вопрос таким образом, который уже не ответил и, по-видимому, в основном является саморекламой. – Tyler Rinker 9 May 2016 в 01:50
  • 4
    Вы правы, я попытался неявно ответить на вопрос. Давайте сделаем это явным, надеясь, что это может быть ответ на вопрос. – Espanta 18 May 2016 в 04:16
  • 5
    @TylerRinker Как это сейчас? – Espanta 18 May 2016 в 04:23

Основываясь на решении daroczig, если вы не хотите указывать список в качестве ввода, вы можете использовать

# Foo
mLoad <- function(...) {
  sapply(sapply(match.call(), as.character)[-1], require, character.only = TRUE)
}

# Example 
mLoad(plyr, dplyr, data.table)

... который короче

lapply(list('plyr', 'dplyr', 'data.table'), require, character.only = TRUE)
3
ответ дан goclem 15 August 2018 в 15:45
поделиться

Это должно сделать трюк:

lapply(x, FUN = function(X) {
    do.call("require", list(X)) 
})

(Бит ключа в том, что аргумент args в do.call(what, args) должен быть списком, даже если он имеет только один элемент! )

22
ответ дан Josh O'Brien 15 August 2018 в 15:45
поделиться
  • 1
    Спасибо, отлично работает, но мне нравится более короткая строка кода для ответа daroczig. +1 – Tyler Rinker 18 November 2011 в 02:31
  • 2
    Я абсолютно согласен. Спасибо, что задали вопрос. – Josh O'Brien 18 November 2011 в 02:40
  • 3
    +1 для полезного объяснения того, почему попытки OP не работали. – daroczig 18 November 2011 в 09:40
  • 4
    Часть аргументов do.call, которая должна быть списком, очень информативна. Спасибо за информацию. – Tyler Rinker 18 November 2011 в 16:00

Альтернативный вариант из пакета easypackages. После установки вы можете загружать пакеты наиболее интуитивно понятным способом:

libraries("plyr", "psych", "tm")

В пакет также входит функция установки нескольких пакетов:

packages("plyr", "psych", "tm")

Ссылка здесь .

4
ответ дан luchonacho 15 August 2018 в 15:45
поделиться
  • 1
    Имя функции довольно запутанно / запутано. «Library» в функции library относится к местоположению, где установлены пакеты: пакетная библиотека . Загрузка нескольких пакетов через libraries не имеет смысла. Наличие отдельной функции packages, которая делает что-то еще, делает это еще хуже. Я знаю, что именование является серьезной проблемой в разработке программного обеспечения, но на самом деле. Эти имена особенно плохи. – Konrad Rudolph 23 February 2017 в 00:40
  • 2
  • 3
    – Konrad Rudolph 3 October 2018 в 21:50

Я использую следующую функцию:

mrip <- function(..., install = TRUE){
    reqFun <- function(pack) {
        if(!suppressWarnings(suppressMessages(require(pack, character.only = TRUE)))) {
            message(paste0("unable to load package ", pack,
                           ": attempting to download & then load"))
            install.packages(pack)
            require(pack, character.only = TRUE)
        }
    }
    lapply(..., reqFun)
}

Это пытается загрузить, а если он не удается установить, а затем попытаться загрузить снова.

2
ответ дан ricardo 15 August 2018 в 15:45
поделиться

Пакет CRAN, который я поддерживаю (автор Dason Kurkiewicz), может выполнить это:

Таким образом, пользователь может сделать:

## install.packages("pacman")
pacman::p_load(dplyr, psych, tm) 

и если пакет отсутствует p_load загрузит его из CRAN или Bioconductor.

40
ответ дан Tyler Rinker 15 August 2018 в 15:45
поделиться
  • 1
    +1! Почему вы выбрали короткое имя p_load? Более описательное имя, такое как load_packages, делает назначение функции более ясным. – Paul Hiemstra 12 January 2014 в 15:27
  • 2
    Потому что p обозначает пакет. Каждая функция в полезном и экспортированном пакете начинается с p_. Плюс мы склонны немного использовать библиотеку, и это еще 7 символов. 7 символов x ~ 1000000 времени использования функции x .5 секунд на символ = 3500000 секунд. Это 58333,33 минуты, 972,2222 часа или 40,50926 дней жизни программиста, которые мы им вернули :-) В любом случае наша цель - нажать на CRAN к 1 февраля – Tyler Rinker 12 January 2014 в 15:44
  • 3
    Примерно через год, но мы, наконец, отправились в CRAN. Должно быть, через несколько дней. @trinker (или меня) обязательно измените это, как только оно станет общедоступным. – Dason 15 February 2015 в 02:06
  • 4
    @ Тайлер. Я знаю, что я опаздываю, но я считаю, что ваше обоснование префикса p_ довольно сомнительно. Если проблема связана с проблемой, полностью удалите префикс p_. Фактически, наличие таких префиксов обычно не рекомендуется на других языках по уважительным причинам (я сказал Хэдли о том же, что касается его fct_ ерунды в силах). Это особенно true, так как предполагаемое использование th-пакета имеет квалифицированное пространство имен (pacman::). – Konrad Rudolph 23 February 2017 в 00:36
  • 5
    @TylerRinker Извините за то, что вы боретесь с этой проблемой, но я действительно считаю, что сообщество R просто ошибается здесь, и практически каждый другой современный язык делает это правильно: вы говорите: «Это защищает от конфликтов пространства имен». - Но это для каких пространств имен! Брандмауэр на писателях пакетов должен обучать людей правильно использовать пакеты, а не учитывать их неряшливые методы программирования. – Konrad Rudolph 23 February 2017 в 17:20
Другие вопросы по тегам:

Похожие вопросы: