diff --git a/README.md b/README.md index 616c30dc..c81b2e2f 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ And the development version from install.packages("remotes") remotes::install_github("datashield/dsBaseClient", "") -# Install v6.3.5 with the following -remotes::install_github("datashield/dsBaseClient", "6.3.5") +# Install v7.0.0 with the following +remotes::install_github("datashield/dsBaseClient", "7.0.0") ``` For a full list of development branches, checkout https://github.com/datashield/dsBaseClient/branches diff --git a/_pkgdown.yml b/_pkgdown.yml index f46c2ebc..bcec450b 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,4 +1,5 @@ template: + bootstrap: 5 lang: en-GB params: bootswatch: simplex diff --git a/docs/404.html b/docs/404.html index eaa2175a..1534613f 100644 --- a/docs/404.html +++ b/docs/404.html @@ -4,90 +4,70 @@ - + Page not found (404) • dsBaseClient - - - - - - - + + + + + - - - -
-
-
- Content not found. Please use links in the navbar. -
- - - +
- -
- diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000..5107f896 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,3 @@ +Content not found. Please use links in the navbar. + +# Page not found (404) diff --git a/docs/LICENSE.html b/docs/LICENSE.html index a0698c65..1582465c 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -1,40 +1,33 @@ -NA • dsBaseClient +NA • dsBaseClient + Skip to contents -
-
-
- +
+
+
@@ -245,26 +238,18 @@

NA

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.

-
- - - -
- +
-
- +
diff --git a/docs/LICENSE.md b/docs/LICENSE.md new file mode 100644 index 00000000..16ca9cdc --- /dev/null +++ b/docs/LICENSE.md @@ -0,0 +1,695 @@ +# NA + +``` R + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 +``` + +Copyright (C) 2007 Free Software Foundation, Inc.  +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +``` R + Preamble +``` + +The GNU General Public License is a free, copyleft license for software +and other kinds of works. + +The licenses for most software and other practical works are designed to +take away your freedom to share and change the works. By contrast, the +GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program–to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for them if +you wish), that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these +rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis +or for a fee, you must pass on to the recipients the same freedoms that +you received. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) +assert copyright on the software, and (2) offer you this License giving +you legal permission to copy, distribute and/or modify it. + +For the developers’ and authors’ protection, the GPL clearly explains +that there is no warranty for this free software. For both users’ and +authors’ sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of protecting +users’ freedom to change the software. The systematic pattern of such +abuse occurs in the area of products for individuals to use, which is +precisely where it is most unacceptable. Therefore, we have designed +this version of the GPL to prohibit the practice for those products. If +such problems arise substantially in other domains, we stand ready to +extend this provision to those domains in future versions of the GPL, as +needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +``` R + TERMS AND CONDITIONS +``` + +0. Definitions. + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a “modified version” of the +earlier work or a work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on +the Program. + +To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to +the extent that it includes a convenient and prominently visible feature +that (1) displays an appropriate copyright notice, and (2) tells the +user that there is no warranty for the work (except to the extent that +warranties are provided), that licensees may convey the work under this +License, and how to view a copy of this License. If the interface +presents a list of user commands or options, such as a menu, a prominent +item in the list meets this criterion. + +1. Source Code. + +The “source code” for a work means the preferred form of the work for +making modifications to it. “Object code” means any non-source form of a +work. + +A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that is +widely used among developers working in that language. + +The “System Libraries” of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that Major +Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A “Major +Component”, in this context, means a major essential component (kernel, +window system, and so on) of the specific operating system (if any) on +which the executable work runs, or a compiler used to produce the work, +or an object code interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the +source code needed to generate, install, and (for an executable work) +run the object code and to modify the work, including scripts to control +those activities. However, it does not include the work’s System +Libraries, or general-purpose tools or generally available free programs +which are used unmodified in performing those activities but which are +not part of the work. For example, Corresponding Source includes +interface definition files associated with source files for the work, +and the source code for shared libraries and dynamically linked +subprograms that the work is specifically designed to require, such as +by intimate data communication or control flow between those subprograms +and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +3. Protecting Users’ Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article 11 +of the WIPO copyright treaty adopted on 20 December 1996, or similar +laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to the +covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work’s +users, your or third parties’ legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program’s source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; keep +intact all notices stating that this License and any non-permissive +terms added in accord with section 7 apply to the code; keep intact all +notices of the absence of any warranty; and give all recipients a copy +of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and +you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the terms +of section 4, provided that you also meet all of these conditions: + +``` R +a) The work must carry prominent notices stating that you modified +it, and giving a relevant date. + +b) The work must carry prominent notices stating that it is +released under this License and any conditions added under section +7. This requirement modifies the requirement in section 4 to +"keep intact all notices". + +c) You must license the entire work, as a whole, under this +License to anyone who comes into possession of a copy. This +License will therefore apply, along with any applicable section 7 +additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no +permission to license the work in any other way, but it does not +invalidate such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your +work need not make them do so. +``` + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, and +which are not combined with it such as to form a larger program, in or +on a volume of a storage or distribution medium, is called an +“aggregate” if the compilation and its resulting copyright are not used +to limit the access or legal rights of the compilation’s users beyond +what the individual works permit. Inclusion of a covered work in an +aggregate does not cause this License to apply to the other parts of the +aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +``` R +a) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium +customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by a +written offer, valid for at least three years and valid for as +long as you offer spare parts or customer support for that product +model, to give anyone who possesses the object code either (1) a +copy of the Corresponding Source for all the software in the +product that is covered by this License, on a durable physical +medium customarily used for software interchange, for a price no +more than your reasonable cost of physically performing this +conveying of source, or (2) access to copy the +Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the +written offer to provide the Corresponding Source. This +alternative is allowed only occasionally and noncommercially, and +only if you received the object code with such an offer, in accord +with subsection 6b. + +d) Convey the object code by offering access from a designated +place (gratis or for a charge), and offer equivalent access to the +Corresponding Source in the same way through the same place at no +further charge. You need not require recipients to copy the +Corresponding Source along with the object code. If the place to +copy the object code is a network server, the Corresponding Source +may be on a different server (operated by you or a third party) +that supports equivalent copying facilities, provided you maintain +clear directions next to the object code saying where to find the +Corresponding Source. Regardless of what server hosts the +Corresponding Source, you remain obligated to ensure that it is +available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided +you inform other peers where the object code and Corresponding +Source of the work are being offered to the general public at no +charge under subsection 6d. +``` + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be included +in conveying the object code work. + +A “User Product” is either (1) a “consumer product”, which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of coverage. +For a particular product received by a particular user, “normally used” +refers to a typical or common use of that class of product, regardless +of the status of the particular user or of the way in which the +particular user actually uses, or expects or is expected to use, the +product. A product is a consumer product regardless of whether the +product has substantial commercial, industrial or non-consumer uses, +unless such uses represent the only significant mode of use of the +product. + +“Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product +from a modified version of its Corresponding Source. The information +must suffice to ensure that the continued functioning of the modified +object code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied by +the Installation Information. But this requirement does not apply if +neither you nor any third party retains the ability to install modified +object code on the User Product (for example, the work has been +installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in +accord with this section must be in a format that is publicly documented +(and with an implementation available to the public in source code +form), and must require no special password or key for unpacking, +reading or copying. + +7. Additional Terms. + +“Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by this +License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove +any additional permissions from that copy, or from any part of it. +(Additional permissions may be written to require their own removal in +certain cases when you modify the work.) You may place additional +permissions on material, added by you to a covered work, for which you +have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +``` R +a) Disclaiming warranty or limiting liability differently from the +terms of sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or +author attributions in that material or in the Appropriate Legal +Notices displayed by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or +requiring that modified versions of such material be marked in +reasonable ways as different from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or +authors of the material; or + +e) Declining to grant rights under trademark law for use of some +trade names, trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that +material by anyone who conveys the material (or modified versions of +it) with contractual assumptions of liability to the recipient, for +any liability that these contractual assumptions directly impose on +those licensors and authors. +``` + +All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains a +further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms of +that license document, provided that the further restriction does not +survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must +place, in the relevant source files, a statement of the additional terms +that apply to those files, or a notice indicating where to find the +applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the above +requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally terminates +your license, and (b) permanently, if the copyright holder fails to +notify you of the violation by some reasonable means prior to 60 days +after the cessation. + +Moreover, your license from a particular copyright holder is reinstated +permanently if the copyright holder notifies you of the violation by +some reasonable means, this is the first time you have received notice +of violation of this License (for any work) from that copyright holder, +and you cure the violation prior to 30 days after your receipt of the +notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a +copy of the Program. Ancillary propagation of a covered work occurring +solely as a consequence of using peer-to-peer transmission to receive a +copy likewise does not require acceptance. However, nothing other than +this License grants you permission to propagate or modify any covered +work. These actions infringe copyright if you do not accept this +License. Therefore, by modifying or propagating a covered work, you +indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered work +results from an entity transaction, each party to that transaction who +receives a copy of the work also receives whatever licenses to the work +the party’s predecessor in interest had or could give under the previous +paragraph, plus a right to possession of the Corresponding Source of the +work from the predecessor in interest, if the predecessor has it or can +get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may not +impose a license fee, royalty, or other charge for exercise of rights +granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that any +patent claim is infringed by making, using, selling, offering for sale, +or importing the Program or any portion of it. + +11. Patents. + +A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The work +thus licensed is called the contributor’s “contributor version”. + +A contributor’s “essential patent claims” are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter +acquired, that would be infringed by some manner, permitted by this +License, of making, using, or selling its contributor version, but do +not include claims that would be infringed only as a consequence of +further modification of the contributor version. For purposes of this +definition, “control” includes the right to grant patent sublicenses in +a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor’s essential patent claims, to make, +use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To “grant” such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and +the Corresponding Source of the work is not available for anyone to +copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. “Knowingly relying” means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient’s use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify or +convey a specific copy of the covered work, then the patent license you +grant is automatically extended to all recipients of the covered work +and works based on it. + +A patent license is “discriminatory” if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you are +a party to an arrangement with a third party that is in the business of +distributing software, under which you make payment to the third party +based on the extent of your activity of conveying the work, and under +which the third party grants, to any of the parties who would receive +the covered work from you, a discriminatory patent license (a) in +connection with copies of the covered work conveyed by you (or copies +made from those copies), or (b) primarily for and in connection with +specific products or compilations that contain the covered work, unless +you entered into that arrangement, or that patent license was granted, +prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any +implied license or other defenses to infringement that may otherwise be +available to you under applicable patent law. + +12. No Surrender of Others’ Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not convey it at all. For example, if you agree to terms that +obligate you to collect a royalty for further conveying from those to +whom you convey the Program, the only way you could satisfy both those +terms and this License would be to refrain entirely from conveying the +Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission +to link or combine any covered work with a work licensed under version 3 +of the GNU Affero General Public License into a single combined work, +and to convey the resulting work. The terms of this License will +continue to apply to the part which is the covered work, but the special +requirements of the GNU Affero General Public License, section 13, +concerning interaction through a network will apply to the combination +as such. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License “or any later version” applies to it, you have the option of +following the terms and conditions either of that numbered version or of +any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free Software +Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy’s public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different permissions. +However, no additional obligations are imposed on any author or +copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF +THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES +SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE +WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above +cannot be given local legal effect according to their terms, reviewing +courts shall apply local law that most closely approximates an absolute +waiver of all civil liability in connection with the Program, unless a +warranty or assumption of liability accompanies a copy of the Program in +return for a fee. + +``` R + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs +``` + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +“copyright” line and a pointer to where the full notice is found. + +``` R +{one line to give the program's name and a brief idea of what it does.} +Copyright (C) {year} {name of author} + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +``` + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice +like this when it starts in an interactive mode: + +``` R +{project} Copyright (C) {year} {fullname} +This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. +``` + +The hypothetical commands `show w' and`show c’ should show the +appropriate parts of the General Public License. Of course, your +program’s commands might be different; for a GUI interface, you would +use an “about box”. + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a “copyright disclaimer” for the program, if +necessary. For more information on this, and how to apply and follow the +GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read +[http://www.gnu.org/philosophy/why-not-lgpl.html](http://www.gnu.org/philosophy/why-not-lgpl.md). diff --git a/docs/authors.html b/docs/authors.html index a4610f7f..e7f2737f 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -1,44 +1,37 @@ -Authors and Citation • dsBaseClient - - -
-
-
-
- + + + +
+
+
+
+ +
+

Authors

+
  • Paul Burton. Author.

    @@ -91,30 +84,31 @@

    Authors and Citation

    Stuart Wheater. Author, maintainer.

  • +
  • +

    Tim Cadman. Author. +
    Genomics Coordination Centre, UMCG, Netherlands

    +
-
-
-

Citation

-
-
+
+

Citation

+

- -

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, Escribà-Montagut X, Wheater S (????). +

Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, Escribà-Montagut X, Wheater S, Cadman T (????). dsBaseClient: 'DataSHIELD' Client Side Base Functions. R package version 7.0.0.9000.

-
@Manual{,
+      
@Manual{,
   title = {dsBaseClient: 'DataSHIELD' Client Side Base Functions},
-  author = {Paul Burton and Rebecca Wilson and Olly Butters and Patricia Ryser-Welch and Alex Westerberg and Leire Abarrategui and Roberto Villegas-Diaz and Demetris Avraam and Yannick Marcon and Tom Bishop and Amadou Gaye and Xavier Escribà-Montagut and Stuart Wheater},
+  author = {Paul Burton and Rebecca Wilson and Olly Butters and Patricia Ryser-Welch and Alex Westerberg and Leire Abarrategui and Roberto Villegas-Diaz and Demetris Avraam and Yannick Marcon and Tom Bishop and Amadou Gaye and Xavier Escribà-Montagut and Stuart Wheater and Tim Cadman},
   note = {R package version 7.0.0.9000},
 }
-

Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion J, Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Schmidt C, Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014). +

Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion J, Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Schmidt C, Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014). “DataSHIELD: taking the analysis to the data, not the data to the analysis.” International Journal of Epidemiology, 43(6), 1929–1944. doi:10.1093/ije/dyu188.

-
@Article{,
+      
@Article{,
   title = {{DataSHIELD: taking the analysis to the data, not the data to the analysis}},
   author = {Amadou Gaye and Yannick Marcon and Julia Isaeva and Philippe {LaFlamme} and Andrew Turner and Elinor M Jones and Joel Minion and Andrew W Boyd and Christopher J Newby and Marja-Liisa Nuotio and Rebecca Wilson and Oliver Butters and Barnaby Murtagh and Ipek Demir and Dany Doiron and Lisette Giepmans and Susan E Wallace and Isabelle Budin-Lj{\o}sne and Carsten O. Schmidt and Paolo Boffetta and Mathieu Boniol and Maria Bota and Kim W Carter and Nick {deKlerk} and Chris Dibben and Richard W Francis and Tero Hiekkalinna and Kristian Hveem and Kirsti Kval{\o}y and Sean Millar and Ivan J Perry and Annette Peters and Catherine M Phillips and Frank Popham and Gillian Raab and Eva Reischl and Nuala Sheehan and Melanie Waldenberger and Markus Perola and Edwin {{van den Heuvel}} and John Macleod and Bartha M Knoppers and Ronald P Stolk and Isabel Fortier and Jennifer R Harris and Bruce H R Woffenbuttel and Madeleine J Murtagh and Vincent Ferretti and Paul R Burton},
   journal = {International Journal of Epidemiology},
@@ -124,12 +118,12 @@ 

Citation

pages = {1929--1944}, doi = {10.1093/ije/dyu188}, }
-

Wilson R, Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, Burton P (2017). +

Wilson R, Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, Burton P (2017). “DataSHIELD – New Directions and Dimensions.” Data Science Journal, 16(21), 1–21. doi:10.5334/dsj-2017-021.

-
@Article{,
+      
@Article{,
   title = {{DataSHIELD – New Directions and Dimensions}},
   author = {Rebecca C. Wilson and Oliver W. Butters and Demetris Avraam and James Baker and Jonathan A. Tedds and Andrew Turner and Madeleine Murtagh and Paul R. Burton},
   journal = {Data Science Journal},
@@ -139,12 +133,12 @@ 

Citation

pages = {1--21}, doi = {10.5334/dsj-2017-021}, }
-

Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). +

Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1–21. doi:10.1093/bioadv/vbaf046.

-
@Article{,
+      
@Article{,
   title = {{DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform}},
   author = {Demetris Avraam and Rebecca C Wilson and Noemi {{Aguirre Chan}} and Soumya Banerjee and Tom R P Bishop and Olly Butters and Tim Cadman and Luise Cederkvist and Liesbeth Duijts and Xavier {{Escrib{\a`a} Montagut}} and Hugh Garner and Gon{\c c}alo {Gon{\c c}alves} and Juan R Gonz{\a'a}lez and Sido Haakma and Mette Hartlev and Jan Hasenauer and Manuel Huth and Eleanor Hyde and Vincent W V Jaddoe and Yannick Marcon and Michaela Th Mayrhofer and Fruzsina Molnar-Gabor and Andrei Scott Morgan and Madeleine Murtagh and Marc Nestor and Anne-Marie {{Nybo Andersen}} and Simon Parker and Angela {{Pinot de Moira}} and Florian Schwarz and Katrine Strandberg-Larsen and Morris A Swertz and Marieke Welten and Stuart Wheater and Paul R Burton},
   journal = {Bioinformatics Advances},
@@ -156,23 +150,21 @@ 

Citation

editor = {Thomas Lengauer}, publisher = {Oxford University Press (OUP)}, }
+
-
- -
- +
-
- +
diff --git a/docs/authors.md b/docs/authors.md new file mode 100644 index 00000000..ea2c8835 --- /dev/null +++ b/docs/authors.md @@ -0,0 +1,111 @@ +# Authors and Citation + +## Authors + +- **Paul Burton**. Author. [](https://orcid.org/0000-0001-5799-9634) + +- **Rebecca Wilson**. Author. [](https://orcid.org/0000-0003-2294-593X) + +- **Olly Butters**. Author. [](https://orcid.org/0000-0003-0354-8461) + +- **Patricia Ryser-Welch**. Author. + [](https://orcid.org/0000-0002-0070-0264) + +- **Alex Westerberg**. Author. + +- **Leire Abarrategui**. Author. + +- **Roberto Villegas-Diaz**. Author. + [](https://orcid.org/0000-0001-5036-8661) + +- **Demetris Avraam**. Author. [](https://orcid.org/0000-0001-8908-2441) + +- **Yannick Marcon**. Author. [](https://orcid.org/0000-0003-0138-2023) + +- **Tom Bishop**. Author. + +- **Amadou Gaye**. Author. [](https://orcid.org/0000-0002-1180-2792) + +- **Xavier Escribà-Montagut**. Author. + [](https://orcid.org/0000-0003-2888-8948) + +- **Stuart Wheater**. Author, maintainer. + [](https://orcid.org/0009-0003-2419-1964) + +- **Tim Cadman**. Author. [](https://orcid.org/0000-0002-7682-5645) + Genomics Coordination Centre, UMCG, Netherlands + +## Citation + +Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, Abarrategui +L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, +Escribà-Montagut X, Wheater S, Cadman T (????). *dsBaseClient: +'DataSHIELD' Client Side Base Functions*. R package version 7.0.0.9000. + + @Manual{, + title = {dsBaseClient: 'DataSHIELD' Client Side Base Functions}, + author = {Paul Burton and Rebecca Wilson and Olly Butters and Patricia Ryser-Welch and Alex Westerberg and Leire Abarrategui and Roberto Villegas-Diaz and Demetris Avraam and Yannick Marcon and Tom Bishop and Amadou Gaye and Xavier Escribà-Montagut and Stuart Wheater and Tim Cadman}, + note = {R package version 7.0.0.9000}, + } + +Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion J, +Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, +Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Schmidt C, Boffetta P, +Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna +T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips C, Popham F, +Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel +E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, Woffenbuttel B, +Murtagh M, Ferretti V, Burton P (2014). “DataSHIELD: taking the analysis +to the data, not the data to the analysis.” *International Journal of +Epidemiology*, **43**(6), 1929–1944. +[doi:10.1093/ije/dyu188](https://doi.org/10.1093/ije/dyu188). + + @Article{, + title = {{DataSHIELD: taking the analysis to the data, not the data to the analysis}}, + author = {Amadou Gaye and Yannick Marcon and Julia Isaeva and Philippe {LaFlamme} and Andrew Turner and Elinor M Jones and Joel Minion and Andrew W Boyd and Christopher J Newby and Marja-Liisa Nuotio and Rebecca Wilson and Oliver Butters and Barnaby Murtagh and Ipek Demir and Dany Doiron and Lisette Giepmans and Susan E Wallace and Isabelle Budin-Lj{\o}sne and Carsten O. Schmidt and Paolo Boffetta and Mathieu Boniol and Maria Bota and Kim W Carter and Nick {deKlerk} and Chris Dibben and Richard W Francis and Tero Hiekkalinna and Kristian Hveem and Kirsti Kval{\o}y and Sean Millar and Ivan J Perry and Annette Peters and Catherine M Phillips and Frank Popham and Gillian Raab and Eva Reischl and Nuala Sheehan and Melanie Waldenberger and Markus Perola and Edwin {{van den Heuvel}} and John Macleod and Bartha M Knoppers and Ronald P Stolk and Isabel Fortier and Jennifer R Harris and Bruce H R Woffenbuttel and Madeleine J Murtagh and Vincent Ferretti and Paul R Burton}, + journal = {International Journal of Epidemiology}, + year = {2014}, + volume = {43}, + number = {6}, + pages = {1929--1944}, + doi = {10.1093/ije/dyu188}, + } + +Wilson R, Butters O, Avraam D, Baker J, Tedds J, Turner A, Murtagh M, +Burton P (2017). “DataSHIELD – New Directions and Dimensions.” *Data +Science Journal*, **16**(21), 1–21. +[doi:10.5334/dsj-2017-021](https://doi.org/10.5334/dsj-2017-021). + + @Article{, + title = {{DataSHIELD – New Directions and Dimensions}}, + author = {Rebecca C. Wilson and Oliver W. Butters and Demetris Avraam and James Baker and Jonathan A. Tedds and Andrew Turner and Madeleine Murtagh and Paul R. Burton}, + journal = {Data Science Journal}, + year = {2017}, + volume = {16}, + number = {21}, + pages = {1--21}, + doi = {10.5334/dsj-2017-021}, + } + +Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, +Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, +Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde +E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, +Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, +Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). +“DataSHIELD: mitigating disclosure risk in a multi-site federated +analysis platform.” *Bioinformatics Advances*, **5**(1), 1–21. +[doi:10.1093/bioadv/vbaf046](https://doi.org/10.1093/bioadv/vbaf046). + + @Article{, + title = {{DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform}}, + author = {Demetris Avraam and Rebecca C Wilson and Noemi {{Aguirre Chan}} and Soumya Banerjee and Tom R P Bishop and Olly Butters and Tim Cadman and Luise Cederkvist and Liesbeth Duijts and Xavier {{Escrib{\a`a} Montagut}} and Hugh Garner and Gon{\c c}alo {Gon{\c c}alves} and Juan R Gonz{\a'a}lez and Sido Haakma and Mette Hartlev and Jan Hasenauer and Manuel Huth and Eleanor Hyde and Vincent W V Jaddoe and Yannick Marcon and Michaela Th Mayrhofer and Fruzsina Molnar-Gabor and Andrei Scott Morgan and Madeleine Murtagh and Marc Nestor and Anne-Marie {{Nybo Andersen}} and Simon Parker and Angela {{Pinot de Moira}} and Florian Schwarz and Katrine Strandberg-Larsen and Morris A Swertz and Marieke Welten and Stuart Wheater and Paul R Burton}, + journal = {Bioinformatics Advances}, + year = {2024}, + volume = {5}, + number = {1}, + pages = {1--21}, + doi = {10.1093/bioadv/vbaf046}, + editor = {Thomas Lengauer}, + publisher = {Oxford University Press (OUP)}, + } diff --git a/docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js b/docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js new file mode 100644 index 00000000..0b873693 --- /dev/null +++ b/docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,(t,e)=>`#${CSS.escape(e)}`)),t),s=t=>null==t?`${t}`:Object.prototype.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),o=t=>{t.dispatchEvent(new Event(i))},r=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),a=t=>r(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,l=t=>{if(!r(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},c=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),h=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?h(t.parentNode):null},d=()=>{},u=t=>{t.offsetHeight},f=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,p=[],m=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=f();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",()=>{for(const t of p)t()}),p.push(e)):e()},_=(t,e=[],i=t)=>"function"==typeof t?t.call(...e):i,b=(t,e,n=!0)=>{if(!n)return void _(t);const s=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),_(t))};e.addEventListener(i,a),setTimeout(()=>{r||o(e)},s)},v=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},y=/[^.]*(?=\..*)\.|.*/,w=/\..*/,A=/::\d+$/,E={};let T=1;const C={mouseenter:"mouseover",mouseleave:"mouseout"},O=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function x(t,e){return e&&`${e}::${T++}`||t.uidEvent||T++}function k(t){const e=x(t);return t.uidEvent=e,E[e]=E[e]||{},E[e]}function L(t,e,i=null){return Object.values(t).find(t=>t.callable===e&&t.delegationSelector===i)}function S(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return O.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=S(e,i,n);if(e in C){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=k(t),c=l[a]||(l[a]={}),h=L(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=x(r,e.replace(y,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function $(t,e,i,n,s){const o=L(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&$(t,e,i,r.callable,r.delegationSelector)}function N(t){return t=t.replace(w,""),C[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=S(e,i,n),a=r!==e,l=k(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(A,"");a&&!e.includes(s)||$(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;$(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=f();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=j(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function F(t){return t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}const H={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter(t=>t.startsWith("bs")&&!t.startsWith("bsConfig"));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${F(e)}`))};class W{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=r(e)?H.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...r(e)?H.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[i,n]of Object.entries(e)){const e=t[i],o=r(e)?"element":s(e);if(!new RegExp(n).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${o}" but expected type "${n}".`)}}}class B extends W{constructor(t,i){super(),(t=a(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){b(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(a(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.8"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const z=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map(t=>n(t)).join(","):null},R={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,t).filter(t=>!c(t)&&l(t))},getSelectorFromElement(t){const e=z(t);return e&&R.findOne(e)?e:null},getElementFromSelector(t){const e=z(t);return e?R.findOne(e):null},getMultipleElementsFromSelector(t){const e=z(t);return e?R.find(e):[]}},q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;P.on(document,i,`[data-bs-dismiss="${n}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),c(this))return;const s=R.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()})},V=".bs.alert",K=`close${V}`,Q=`closed${V}`;class X extends B{static get NAME(){return"alert"}close(){if(P.trigger(this._element,K).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,Q),this.dispose()}static jQueryInterface(t){return this.each(function(){const e=X.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}q(X,"close"),g(X);const Y='[data-bs-toggle="button"]';class U extends B{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each(function(){const e=U.getOrCreateInstance(this);"toggle"===t&&e[t]()})}}P.on(document,"click.bs.button.data-api",Y,t=>{t.preventDefault();const e=t.target.closest(Y);U.getOrCreateInstance(e).toggle()}),g(U);const G=".bs.swipe",J=`touchstart${G}`,Z=`touchmove${G}`,tt=`touchend${G}`,et=`pointerdown${G}`,it=`pointerup${G}`,nt={endCallback:null,leftCallback:null,rightCallback:null},st={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class ot extends W{constructor(t,e){super(),this._element=t,t&&ot.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return nt}static get DefaultType(){return st}static get NAME(){return"swipe"}dispose(){P.off(this._element,G)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),_(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&_(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,et,t=>this._start(t)),P.on(this._element,it,t=>this._end(t)),this._element.classList.add("pointer-event")):(P.on(this._element,J,t=>this._start(t)),P.on(this._element,Z,t=>this._move(t)),P.on(this._element,tt,t=>this._end(t)))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const rt=".bs.carousel",at=".data-api",lt="ArrowLeft",ct="ArrowRight",ht="next",dt="prev",ut="left",ft="right",pt=`slide${rt}`,mt=`slid${rt}`,gt=`keydown${rt}`,_t=`mouseenter${rt}`,bt=`mouseleave${rt}`,vt=`dragstart${rt}`,yt=`load${rt}${at}`,wt=`click${rt}${at}`,At="carousel",Et="active",Tt=".active",Ct=".carousel-item",Ot=Tt+Ct,xt={[lt]:ft,[ct]:ut},kt={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Lt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class St extends B{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=R.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===At&&this.cycle()}static get Default(){return kt}static get DefaultType(){return Lt}static get NAME(){return"carousel"}next(){this._slide(ht)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(dt)}pause(){this._isSliding&&o(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,mt,()=>this.cycle()):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,mt,()=>this.to(t));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ht:dt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,gt,t=>this._keydown(t)),"hover"===this._config.pause&&(P.on(this._element,_t,()=>this.pause()),P.on(this._element,bt,()=>this._maybeEnableCycle())),this._config.touch&&ot.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of R.find(".carousel-item img",this._element))P.on(t,vt,t=>t.preventDefault());const t={leftCallback:()=>this._slide(this._directionToOrder(ut)),rightCallback:()=>this._slide(this._directionToOrder(ft)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new ot(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=xt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=R.findOne(Tt,this._indicatorsElement);e.classList.remove(Et),e.removeAttribute("aria-current");const i=R.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Et),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ht,s=e||v(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(pt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),u(s),i.classList.add(l),s.classList.add(l),this._queueCallback(()=>{s.classList.remove(l,c),s.classList.add(Et),i.classList.remove(Et,c,l),this._isSliding=!1,r(mt)},i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return R.findOne(Ot,this._element)}_getItems(){return R.find(Ct,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return m()?t===ut?dt:ht:t===ut?ht:dt}_orderToDirection(t){return m()?t===dt?ut:ft:t===dt?ft:ut}static jQueryInterface(t){return this.each(function(){const e=St.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)})}}P.on(document,wt,"[data-bs-slide], [data-bs-slide-to]",function(t){const e=R.getElementFromSelector(this);if(!e||!e.classList.contains(At))return;t.preventDefault();const i=St.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===H.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())}),P.on(window,yt,()=>{const t=R.find('[data-bs-ride="carousel"]');for(const e of t)St.getOrCreateInstance(e)}),g(St);const Dt=".bs.collapse",$t=`show${Dt}`,It=`shown${Dt}`,Nt=`hide${Dt}`,Pt=`hidden${Dt}`,jt=`click${Dt}.data-api`,Mt="show",Ft="collapse",Ht="collapsing",Wt=`:scope .${Ft} .${Ft}`,Bt='[data-bs-toggle="collapse"]',zt={parent:null,toggle:!0},Rt={parent:"(null|element)",toggle:"boolean"};class qt extends B{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=R.find(Bt);for(const t of i){const e=R.getSelectorFromElement(t),i=R.find(e).filter(t=>t===this._element);null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return zt}static get DefaultType(){return Rt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(t=>t!==this._element).map(t=>qt.getOrCreateInstance(t,{toggle:!1}))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,$t).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Ft),this._element.classList.add(Ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(Ht),this._element.classList.add(Ft,Mt),this._element.style[e]="",P.trigger(this._element,It)},this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,Nt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,u(this._element),this._element.classList.add(Ht),this._element.classList.remove(Ft,Mt);for(const t of this._triggerArray){const e=R.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(Ht),this._element.classList.add(Ft),P.trigger(this._element,Pt)},this._element,!0)}_isShown(t=this._element){return t.classList.contains(Mt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=a(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Bt);for(const e of t){const t=R.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=R.find(Wt,this._config.parent);return R.find(t,this._config.parent).filter(t=>!e.includes(t))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each(function(){const i=qt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}})}}P.on(document,jt,Bt,function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of R.getMultipleElementsFromSelector(this))qt.getOrCreateInstance(t,{toggle:!1}).toggle()}),g(qt);var Vt="top",Kt="bottom",Qt="right",Xt="left",Yt="auto",Ut=[Vt,Kt,Qt,Xt],Gt="start",Jt="end",Zt="clippingParents",te="viewport",ee="popper",ie="reference",ne=Ut.reduce(function(t,e){return t.concat([e+"-"+Gt,e+"-"+Jt])},[]),se=[].concat(Ut,[Yt]).reduce(function(t,e){return t.concat([e,e+"-"+Gt,e+"-"+Jt])},[]),oe="beforeRead",re="read",ae="afterRead",le="beforeMain",ce="main",he="afterMain",de="beforeWrite",ue="write",fe="afterWrite",pe=[oe,re,ae,le,ce,he,de,ue,fe];function me(t){return t?(t.nodeName||"").toLowerCase():null}function ge(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function _e(t){return t instanceof ge(t).Element||t instanceof Element}function be(t){return t instanceof ge(t).HTMLElement||t instanceof HTMLElement}function ve(t){return"undefined"!=typeof ShadowRoot&&(t instanceof ge(t).ShadowRoot||t instanceof ShadowRoot)}const ye={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach(function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];be(s)&&me(s)&&(Object.assign(s.style,i),Object.keys(n).forEach(function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)}))})},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach(function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce(function(t,e){return t[e]="",t},{});be(n)&&me(n)&&(Object.assign(n.style,o),Object.keys(s).forEach(function(t){n.removeAttribute(t)}))})}},requires:["computeStyles"]};function we(t){return t.split("-")[0]}var Ae=Math.max,Ee=Math.min,Te=Math.round;function Ce(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function Oe(){return!/^((?!chrome|android).)*safari/i.test(Ce())}function xe(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&be(t)&&(s=t.offsetWidth>0&&Te(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Te(n.height)/t.offsetHeight||1);var r=(_e(t)?ge(t):window).visualViewport,a=!Oe()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function ke(t){var e=xe(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Le(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ve(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Se(t){return ge(t).getComputedStyle(t)}function De(t){return["table","td","th"].indexOf(me(t))>=0}function $e(t){return((_e(t)?t.ownerDocument:t.document)||window.document).documentElement}function Ie(t){return"html"===me(t)?t:t.assignedSlot||t.parentNode||(ve(t)?t.host:null)||$e(t)}function Ne(t){return be(t)&&"fixed"!==Se(t).position?t.offsetParent:null}function Pe(t){for(var e=ge(t),i=Ne(t);i&&De(i)&&"static"===Se(i).position;)i=Ne(i);return i&&("html"===me(i)||"body"===me(i)&&"static"===Se(i).position)?e:i||function(t){var e=/firefox/i.test(Ce());if(/Trident/i.test(Ce())&&be(t)&&"fixed"===Se(t).position)return null;var i=Ie(t);for(ve(i)&&(i=i.host);be(i)&&["html","body"].indexOf(me(i))<0;){var n=Se(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function je(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Me(t,e,i){return Ae(t,Ee(e,i))}function Fe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function He(t,e){return e.reduce(function(e,i){return e[i]=t,e},{})}const We={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=we(i.placement),l=je(a),c=[Xt,Qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Fe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:He(t,Ut))}(s.padding,i),d=ke(o),u="y"===l?Vt:Xt,f="y"===l?Kt:Qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=Pe(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Me(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Le(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Be(t){return t.split("-")[1]}var ze={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Re(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Xt,y=Vt,w=window;if(c){var A=Pe(i),E="clientHeight",T="clientWidth";A===ge(i)&&"static"!==Se(A=$e(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===Vt||(s===Xt||s===Qt)&&o===Jt)&&(y=Kt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Xt&&(s!==Vt&&s!==Kt||o!==Jt)||(v=Qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&ze),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:Te(i*s)/s||0,y:Te(n*s)/s||0}}({x:f,y:m},ge(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const qe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:we(e.placement),variation:Be(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,Re(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,Re(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var Ve={passive:!0};const Ke={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=ge(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach(function(t){t.addEventListener("scroll",i.update,Ve)}),a&&l.addEventListener("resize",i.update,Ve),function(){o&&c.forEach(function(t){t.removeEventListener("scroll",i.update,Ve)}),a&&l.removeEventListener("resize",i.update,Ve)}},data:{}};var Qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Xe(t){return t.replace(/left|right|bottom|top/g,function(t){return Qe[t]})}var Ye={start:"end",end:"start"};function Ue(t){return t.replace(/start|end/g,function(t){return Ye[t]})}function Ge(t){var e=ge(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Je(t){return xe($e(t)).left+Ge(t).scrollLeft}function Ze(t){var e=Se(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ti(t){return["html","body","#document"].indexOf(me(t))>=0?t.ownerDocument.body:be(t)&&Ze(t)?t:ti(Ie(t))}function ei(t,e){var i;void 0===e&&(e=[]);var n=ti(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=ge(n),r=s?[o].concat(o.visualViewport||[],Ze(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ei(Ie(r)))}function ii(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ni(t,e,i){return e===te?ii(function(t,e){var i=ge(t),n=$e(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Oe();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Je(t),y:l}}(t,i)):_e(e)?function(t,e){var i=xe(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ii(function(t){var e,i=$e(t),n=Ge(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Ae(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Ae(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Je(t),l=-n.scrollTop;return"rtl"===Se(s||i).direction&&(a+=Ae(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}($e(t)))}function si(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?we(s):null,r=s?Be(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case Vt:e={x:a,y:i.y-n.height};break;case Kt:e={x:a,y:i.y+i.height};break;case Qt:e={x:i.x+i.width,y:l};break;case Xt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?je(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Gt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Jt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function oi(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Zt:a,c=i.rootBoundary,h=void 0===c?te:c,d=i.elementContext,u=void 0===d?ee:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Fe("number"!=typeof g?g:He(g,Ut)),b=u===ee?ie:ee,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ei(Ie(t)),i=["absolute","fixed"].indexOf(Se(t).position)>=0&&be(t)?Pe(t):t;return _e(i)?e.filter(function(t){return _e(t)&&Le(t,i)&&"body"!==me(t)}):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce(function(e,i){var s=ni(t,i,n);return e.top=Ae(s.top,e.top),e.right=Ee(s.right,e.right),e.bottom=Ee(s.bottom,e.bottom),e.left=Ae(s.left,e.left),e},ni(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(_e(y)?y:y.contextElement||$e(t.elements.popper),l,h,r),A=xe(t.elements.reference),E=si({reference:A,element:v,placement:s}),T=ii(Object.assign({},v,E)),C=u===ee?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===ee&&x){var k=x[s];Object.keys(O).forEach(function(t){var e=[Qt,Kt].indexOf(t)>=0?1:-1,i=[Vt,Kt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e})}return O}function ri(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?se:l,h=Be(n),d=h?a?ne:ne.filter(function(t){return Be(t)===h}):Ut,u=d.filter(function(t){return c.indexOf(t)>=0});0===u.length&&(u=d);var f=u.reduce(function(e,i){return e[i]=oi(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[we(i)],e},{});return Object.keys(f).sort(function(t,e){return f[t]-f[e]})}const ai={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=we(g),b=l||(_!==g&&p?function(t){if(we(t)===Yt)return[];var e=Xe(t);return[Ue(t),e,Ue(e)]}(g):[Xe(g)]),v=[g].concat(b).reduce(function(t,i){return t.concat(we(i)===Yt?ri(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)},[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=oi(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?Qt:Xt:k?Kt:Vt;y[S]>w[S]&&($=Xe($));var I=Xe($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every(function(t){return t})){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find(function(e){var i=A.get(e);if(i)return i.slice(0,t).every(function(t){return t})});if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==P(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function li(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ci(t){return[Vt,Qt,Kt,Xt].some(function(e){return t[e]>=0})}const hi={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=oi(e,{elementContext:"reference"}),a=oi(e,{altBoundary:!0}),l=li(r,n),c=li(a,s,o),h=ci(l),d=ci(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},di={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=se.reduce(function(t,i){return t[i]=function(t,e,i){var n=we(t),s=[Xt,Vt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Xt,Qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t},{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ui={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=si({reference:e.rects.reference,element:e.rects.popper,placement:e.placement})},data:{}},fi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=oi(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=we(e.placement),b=Be(e.placement),v=!b,y=je(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?Vt:Xt,D="y"===y?Kt:Qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],j=f?-T[$]/2:0,M=b===Gt?E[$]:T[$],F=b===Gt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?ke(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Me(0,E[$],W[$]),V=v?E[$]/2-j-q-z-O.mainAxis:M-q-z-O.mainAxis,K=v?-E[$]/2+j+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&Pe(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Me(f?Ee(N,I+V-Y-X):N,I,f?Ae(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?Vt:Xt,tt="x"===y?Kt:Qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[Vt,Xt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Me(t,e,i);return n>i?i:n}(at,et,lt):Me(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function pi(t,e,i){void 0===i&&(i=!1);var n,s,o=be(e),r=be(e)&&function(t){var e=t.getBoundingClientRect(),i=Te(e.width)/t.offsetWidth||1,n=Te(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=$e(e),l=xe(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==me(e)||Ze(a))&&(c=(n=e)!==ge(n)&&be(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Ge(n)),be(e)?((h=xe(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Je(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function mi(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach(function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}}),n.push(t)}return t.forEach(function(t){e.set(t.name,t)}),t.forEach(function(t){i.has(t.name)||s(t)}),n}var gi={placement:"bottom",modifiers:[],strategy:"absolute"};function _i(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(H.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..._(this._config.popperConfig,[void 0,t])}}_selectMenuItem({key:t,target:e}){const i=R.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(t=>l(t));i.length&&v(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each(function(){const e=Qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=R.find(Mi);for(const i of e){const e=Qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(ji)?this:R.prev(this,ji)[0]||R.next(this,ji)[0]||R.findOne(ji,t.delegateTarget.parentNode),o=Qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ii,ji,Qi.dataApiKeydownHandler),P.on(document,Ii,Fi,Qi.dataApiKeydownHandler),P.on(document,$i,Qi.clearMenus),P.on(document,Ni,Qi.clearMenus),P.on(document,$i,ji,function(t){t.preventDefault(),Qi.getOrCreateInstance(this).toggle()}),g(Qi);const Xi="backdrop",Yi="show",Ui=`mousedown.bs.${Xi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends W{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Xi}show(t){if(!this._config.isVisible)return void _(t);this._append();const e=this._getElement();this._config.isAnimated&&u(e),e.classList.add(Yi),this._emulateAnimation(()=>{_(t)})}hide(t){this._config.isVisible?(this._getElement().classList.remove(Yi),this._emulateAnimation(()=>{this.dispose(),_(t)})):_(t)}dispose(){this._isAppended&&(P.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=a(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,Ui,()=>{_(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(t){b(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends W{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,tn),P.on(document,en,t=>this._handleFocusin(t)),P.on(document,nn,t=>this._handleKeydown(t)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=R.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,e=>e+t),this._setElementAttributes(ln,hn,e=>e+t),this._setElementAttributes(cn,dn,e=>e-t)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)})}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&H.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const i=H.getDataAttribute(t,e);null!==i?(H.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)})}_applyManipulationCallback(t,e){if(r(t))e(t);else for(const i of R.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,An=`keydown.dismiss${fn}`,En=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends B{constructor(t,e){super(t,e),this._dialog=R.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t)))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){P.off(window,fn),P.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=R.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),u(this._element),this._element.classList.add(Cn),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,bn,{relatedTarget:t})},this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,An,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),P.on(window,vn,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),P.on(this._element,wn,t=>{P.one(this._element,yn,e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,gn)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback(()=>{this._element.classList.remove(On),this._queueCallback(()=>{this._element.style.overflowY=e},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=m()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=m()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each(function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}})}}P.on(document,En,'[data-bs-toggle="modal"]',function(t){const e=R.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,_n,t=>{t.defaultPrevented||P.one(e,gn,()=>{l(this)&&this.focus()})});const i=R.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)}),q(Ln),g(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",jn=".offcanvas.show",Mn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Wn=`hidePrevented${Sn}`,Bn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Kn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Qn extends B{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Kn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,Mn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),P.trigger(this._element,Fn,{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),P.trigger(this._element,Bn)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Wn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){P.on(this._element,qn,t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Wn))})}static jQueryInterface(t){return this.each(function(){const e=Qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}})}}P.on(document,Rn,'[data-bs-toggle="offcanvas"]',function(t){const e=R.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this))return;P.one(e,Bn,()=>{l(this)&&this.focus()});const i=R.findOne(jn);i&&i!==e&&Qn.getInstance(i).hide(),Qn.getOrCreateInstance(e).toggle(this)}),P.on(window,$n,()=>{for(const t of R.find(jn))Qn.getOrCreateInstance(t).show()}),P.on(window,zn,()=>{for(const t of R.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Qn.getOrCreateInstance(t).hide()}),q(Qn),g(Qn);const Xn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Yn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Yn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter(t=>t instanceof RegExp).some(t=>t.test(i))},Jn={allowList:Xn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends W{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(t=>this._resolvePossibleFunction(t)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=R.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?r(e)?this._putElementInTemplate(a(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return _(t,[void 0,this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs="click",ds={AUTO:"auto",TOP:"top",RIGHT:m()?"left":"right",BOTTOM:"bottom",LEFT:m()?"right":"left"},us={allowList:Xn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},fs={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class ps extends B{constructor(t,e){if(void 0===Ai)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return us}static get DefaultType(){return fs}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(h(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",d);this._queueCallback(()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",d);this._activeTrigger[hs]=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=_(this._config.placement,[this,t,this._element]),i=ds[e.toUpperCase()];return wi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return _(t,[this._element,this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..._(this._config.popperConfig,[void 0,e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger[hs]=!(e._isShown()&&e._activeTrigger[hs]),e.toggle()});else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()}),P.on(this._element,i,this._config.selector,t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=H.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:a(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each(function(){const e=ps.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}g(ps);const ms=".popover-header",gs=".popover-body",_s={...ps.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},bs={...ps.DefaultType,content:"(null|string|element|function)"};class vs extends ps{static get Default(){return _s}static get DefaultType(){return bs}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ms]:this._getTitle(),[gs]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each(function(){const e=vs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}})}}g(vs);const ys=".bs.scrollspy",ws=`activate${ys}`,As=`click${ys}`,Es=`load${ys}.data-api`,Ts="active",Cs="[href]",Os=".nav-link",xs=`${Os}, .nav-item > ${Os}, .list-group-item`,ks={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Ls={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ss extends B{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ks}static get DefaultType(){return Ls}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=a(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map(t=>Number.parseFloat(t))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,As),P.on(this._config.target,As,Cs,t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}}))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=R.find(Cs,this._config.target);for(const e of t){if(!e.hash||c(e))continue;const t=R.findOne(decodeURI(e.hash),this._element);l(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(Ts),this._activateParents(t),P.trigger(this._element,ws,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))R.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(Ts);else for(const e of R.parents(t,".nav, .list-group"))for(const t of R.prev(e,xs))t.classList.add(Ts)}_clearActiveClass(t){t.classList.remove(Ts);const e=R.find(`${Cs}.${Ts}`,t);for(const t of e)t.classList.remove(Ts)}static jQueryInterface(t){return this.each(function(){const e=Ss.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}P.on(window,Es,()=>{for(const t of R.find('[data-bs-spy="scroll"]'))Ss.getOrCreateInstance(t)}),g(Ss);const Ds=".bs.tab",$s=`hide${Ds}`,Is=`hidden${Ds}`,Ns=`show${Ds}`,Ps=`shown${Ds}`,js=`click${Ds}`,Ms=`keydown${Ds}`,Fs=`load${Ds}`,Hs="ArrowLeft",Ws="ArrowRight",Bs="ArrowUp",zs="ArrowDown",Rs="Home",qs="End",Vs="active",Ks="fade",Qs="show",Xs=".dropdown-toggle",Ys=`:not(${Xs})`,Us='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Gs=`.nav-link${Ys}, .list-group-item${Ys}, [role="tab"]${Ys}, ${Us}`,Js=`.${Vs}[data-bs-toggle="tab"], .${Vs}[data-bs-toggle="pill"], .${Vs}[data-bs-toggle="list"]`;class Zs extends B{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,Ms,t=>this._keydown(t)))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,$s,{relatedTarget:t}):null;P.trigger(t,Ns,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Vs),this._activate(R.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,Ps,{relatedTarget:e})):t.classList.add(Qs)},t,t.classList.contains(Ks)))}_deactivate(t,e){t&&(t.classList.remove(Vs),t.blur(),this._deactivate(R.getElementFromSelector(t)),this._queueCallback(()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,Is,{relatedTarget:e})):t.classList.remove(Qs)},t,t.classList.contains(Ks)))}_keydown(t){if(![Hs,Ws,Bs,zs,Rs,qs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter(t=>!c(t));let i;if([Rs,qs].includes(t.key))i=e[t.key===Rs?0:e.length-1];else{const n=[Ws,zs].includes(t.key);i=v(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Zs.getOrCreateInstance(i).show())}_getChildren(){return R.find(Gs,this._parent)}_getActiveElem(){return this._getChildren().find(t=>this._elemIsActive(t))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=R.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=R.findOne(t,i);s&&s.classList.toggle(n,e)};n(Xs,Vs),n(".dropdown-menu",Qs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Vs)}_getInnerElement(t){return t.matches(Gs)?t:R.findOne(Gs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each(function(){const e=Zs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}})}}P.on(document,js,Us,function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),c(this)||Zs.getOrCreateInstance(this).show()}),P.on(window,Fs,()=>{for(const t of R.find(Js))Zs.getOrCreateInstance(t)}),g(Zs);const to=".bs.toast",eo=`mouseover${to}`,io=`mouseout${to}`,no=`focusin${to}`,so=`focusout${to}`,oo=`hide${to}`,ro=`hidden${to}`,ao=`show${to}`,lo=`shown${to}`,co="hide",ho="show",uo="showing",fo={animation:"boolean",autohide:"boolean",delay:"number"},po={animation:!0,autohide:!0,delay:5e3};class mo extends B{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return po}static get DefaultType(){return fo}static get NAME(){return"toast"}show(){P.trigger(this._element,ao).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(co),u(this._element),this._element.classList.add(ho,uo),this._queueCallback(()=>{this._element.classList.remove(uo),P.trigger(this._element,lo),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,oo).defaultPrevented||(this._element.classList.add(uo),this._queueCallback(()=>{this._element.classList.add(co),this._element.classList.remove(uo,ho),P.trigger(this._element,ro)},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(ho),super.dispose()}isShown(){return this._element.classList.contains(ho)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,eo,t=>this._onInteraction(t,!0)),P.on(this._element,io,t=>this._onInteraction(t,!1)),P.on(this._element,no,t=>this._onInteraction(t,!0)),P.on(this._element,so,t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each(function(){const e=mo.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}})}}return q(mo),g(mo),{Alert:X,Button:U,Carousel:St,Collapse:qt,Dropdown:Qi,Modal:Ln,Offcanvas:Qn,Popover:vs,ScrollSpy:Ss,Tab:Zs,Toast:mo,Tooltip:ps}}); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js.map b/docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js.map new file mode 100644 index 00000000..3e678d4c --- /dev/null +++ b/docs/deps/bootstrap-5.3.8/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","toType","object","Object","prototype","toString","call","toLowerCase","triggerTransitionEnd","dispatchEvent","Event","isElement","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","JSON","parse","decodeURIComponent","normalizeDataKey","chr","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ARROW_LEFT_KEY$1","ARROW_RIGHT_KEY$1","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_TOOLTIP_INNER","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","TRIGGER_CLICK","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","SELECTOR_TITLE","SELECTOR_CONTENT","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' +\n '
' +\n '
' +\n '
',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
    and
')},createChildNavList:function(e){var t=this.createNavList();return e.append(t),t},generateNavEl:function(e,t){var n=a('
');n.attr("href","#"+e),n.text(t);var r=a("
  • ");return r.append(n),r},generateNavItem:function(e){var t=this.generateAnchor(e),n=a(e),r=n.data("toc-text")||n.text();return this.generateNavEl(t,r)},getTopLevel:function(e){for(var t=1;t<=6;t++){if(1 + + + + + + + + + + + + diff --git a/docs/deps/font-awesome-6.5.2/css/all.css b/docs/deps/font-awesome-6.5.2/css/all.css new file mode 100644 index 00000000..151dd57c --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/all.css @@ -0,0 +1,8028 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); } + +.fa, +.fa-classic, +.fa-sharp, +.fas, +.fa-solid, +.far, +.fa-regular, +.fab, +.fa-brands { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.fa-classic, +.fa-solid, +.far, +.fa-regular { + font-family: 'Font Awesome 6 Free'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; } } + +@-webkit-keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@-webkit-keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +.fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, 0)); + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ + +.fa-0::before { + content: "\30"; } + +.fa-1::before { + content: "\31"; } + +.fa-2::before { + content: "\32"; } + +.fa-3::before { + content: "\33"; } + +.fa-4::before { + content: "\34"; } + +.fa-5::before { + content: "\35"; } + +.fa-6::before { + content: "\36"; } + +.fa-7::before { + content: "\37"; } + +.fa-8::before { + content: "\38"; } + +.fa-9::before { + content: "\39"; } + +.fa-fill-drip::before { + content: "\f576"; } + +.fa-arrows-to-circle::before { + content: "\e4bd"; } + +.fa-circle-chevron-right::before { + content: "\f138"; } + +.fa-chevron-circle-right::before { + content: "\f138"; } + +.fa-at::before { + content: "\40"; } + +.fa-trash-can::before { + content: "\f2ed"; } + +.fa-trash-alt::before { + content: "\f2ed"; } + +.fa-text-height::before { + content: "\f034"; } + +.fa-user-xmark::before { + content: "\f235"; } + +.fa-user-times::before { + content: "\f235"; } + +.fa-stethoscope::before { + content: "\f0f1"; } + +.fa-message::before { + content: "\f27a"; } + +.fa-comment-alt::before { + content: "\f27a"; } + +.fa-info::before { + content: "\f129"; } + +.fa-down-left-and-up-right-to-center::before { + content: "\f422"; } + +.fa-compress-alt::before { + content: "\f422"; } + +.fa-explosion::before { + content: "\e4e9"; } + +.fa-file-lines::before { + content: "\f15c"; } + +.fa-file-alt::before { + content: "\f15c"; } + +.fa-file-text::before { + content: "\f15c"; } + +.fa-wave-square::before { + content: "\f83e"; } + +.fa-ring::before { + content: "\f70b"; } + +.fa-building-un::before { + content: "\e4d9"; } + +.fa-dice-three::before { + content: "\f527"; } + +.fa-calendar-days::before { + content: "\f073"; } + +.fa-calendar-alt::before { + content: "\f073"; } + +.fa-anchor-circle-check::before { + content: "\e4aa"; } + +.fa-building-circle-arrow-right::before { + content: "\e4d1"; } + +.fa-volleyball::before { + content: "\f45f"; } + +.fa-volleyball-ball::before { + content: "\f45f"; } + +.fa-arrows-up-to-line::before { + content: "\e4c2"; } + +.fa-sort-down::before { + content: "\f0dd"; } + +.fa-sort-desc::before { + content: "\f0dd"; } + +.fa-circle-minus::before { + content: "\f056"; } + +.fa-minus-circle::before { + content: "\f056"; } + +.fa-door-open::before { + content: "\f52b"; } + +.fa-right-from-bracket::before { + content: "\f2f5"; } + +.fa-sign-out-alt::before { + content: "\f2f5"; } + +.fa-atom::before { + content: "\f5d2"; } + +.fa-soap::before { + content: "\e06e"; } + +.fa-icons::before { + content: "\f86d"; } + +.fa-heart-music-camera-bolt::before { + content: "\f86d"; } + +.fa-microphone-lines-slash::before { + content: "\f539"; } + +.fa-microphone-alt-slash::before { + content: "\f539"; } + +.fa-bridge-circle-check::before { + content: "\e4c9"; } + +.fa-pump-medical::before { + content: "\e06a"; } + +.fa-fingerprint::before { + content: "\f577"; } + +.fa-hand-point-right::before { + content: "\f0a4"; } + +.fa-magnifying-glass-location::before { + content: "\f689"; } + +.fa-search-location::before { + content: "\f689"; } + +.fa-forward-step::before { + content: "\f051"; } + +.fa-step-forward::before { + content: "\f051"; } + +.fa-face-smile-beam::before { + content: "\f5b8"; } + +.fa-smile-beam::before { + content: "\f5b8"; } + +.fa-flag-checkered::before { + content: "\f11e"; } + +.fa-football::before { + content: "\f44e"; } + +.fa-football-ball::before { + content: "\f44e"; } + +.fa-school-circle-exclamation::before { + content: "\e56c"; } + +.fa-crop::before { + content: "\f125"; } + +.fa-angles-down::before { + content: "\f103"; } + +.fa-angle-double-down::before { + content: "\f103"; } + +.fa-users-rectangle::before { + content: "\e594"; } + +.fa-people-roof::before { + content: "\e537"; } + +.fa-people-line::before { + content: "\e534"; } + +.fa-beer-mug-empty::before { + content: "\f0fc"; } + +.fa-beer::before { + content: "\f0fc"; } + +.fa-diagram-predecessor::before { + content: "\e477"; } + +.fa-arrow-up-long::before { + content: "\f176"; } + +.fa-long-arrow-up::before { + content: "\f176"; } + +.fa-fire-flame-simple::before { + content: "\f46a"; } + +.fa-burn::before { + content: "\f46a"; } + +.fa-person::before { + content: "\f183"; } + +.fa-male::before { + content: "\f183"; } + +.fa-laptop::before { + content: "\f109"; } + +.fa-file-csv::before { + content: "\f6dd"; } + +.fa-menorah::before { + content: "\f676"; } + +.fa-truck-plane::before { + content: "\e58f"; } + +.fa-record-vinyl::before { + content: "\f8d9"; } + +.fa-face-grin-stars::before { + content: "\f587"; } + +.fa-grin-stars::before { + content: "\f587"; } + +.fa-bong::before { + content: "\f55c"; } + +.fa-spaghetti-monster-flying::before { + content: "\f67b"; } + +.fa-pastafarianism::before { + content: "\f67b"; } + +.fa-arrow-down-up-across-line::before { + content: "\e4af"; } + +.fa-spoon::before { + content: "\f2e5"; } + +.fa-utensil-spoon::before { + content: "\f2e5"; } + +.fa-jar-wheat::before { + content: "\e517"; } + +.fa-envelopes-bulk::before { + content: "\f674"; } + +.fa-mail-bulk::before { + content: "\f674"; } + +.fa-file-circle-exclamation::before { + content: "\e4eb"; } + +.fa-circle-h::before { + content: "\f47e"; } + +.fa-hospital-symbol::before { + content: "\f47e"; } + +.fa-pager::before { + content: "\f815"; } + +.fa-address-book::before { + content: "\f2b9"; } + +.fa-contact-book::before { + content: "\f2b9"; } + +.fa-strikethrough::before { + content: "\f0cc"; } + +.fa-k::before { + content: "\4b"; } + +.fa-landmark-flag::before { + content: "\e51c"; } + +.fa-pencil::before { + content: "\f303"; } + +.fa-pencil-alt::before { + content: "\f303"; } + +.fa-backward::before { + content: "\f04a"; } + +.fa-caret-right::before { + content: "\f0da"; } + +.fa-comments::before { + content: "\f086"; } + +.fa-paste::before { + content: "\f0ea"; } + +.fa-file-clipboard::before { + content: "\f0ea"; } + +.fa-code-pull-request::before { + content: "\e13c"; } + +.fa-clipboard-list::before { + content: "\f46d"; } + +.fa-truck-ramp-box::before { + content: "\f4de"; } + +.fa-truck-loading::before { + content: "\f4de"; } + +.fa-user-check::before { + content: "\f4fc"; } + +.fa-vial-virus::before { + content: "\e597"; } + +.fa-sheet-plastic::before { + content: "\e571"; } + +.fa-blog::before { + content: "\f781"; } + +.fa-user-ninja::before { + content: "\f504"; } + +.fa-person-arrow-up-from-line::before { + content: "\e539"; } + +.fa-scroll-torah::before { + content: "\f6a0"; } + +.fa-torah::before { + content: "\f6a0"; } + +.fa-broom-ball::before { + content: "\f458"; } + +.fa-quidditch::before { + content: "\f458"; } + +.fa-quidditch-broom-ball::before { + content: "\f458"; } + +.fa-toggle-off::before { + content: "\f204"; } + +.fa-box-archive::before { + content: "\f187"; } + +.fa-archive::before { + content: "\f187"; } + +.fa-person-drowning::before { + content: "\e545"; } + +.fa-arrow-down-9-1::before { + content: "\f886"; } + +.fa-sort-numeric-desc::before { + content: "\f886"; } + +.fa-sort-numeric-down-alt::before { + content: "\f886"; } + +.fa-face-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-spray-can::before { + content: "\f5bd"; } + +.fa-truck-monster::before { + content: "\f63b"; } + +.fa-w::before { + content: "\57"; } + +.fa-earth-africa::before { + content: "\f57c"; } + +.fa-globe-africa::before { + content: "\f57c"; } + +.fa-rainbow::before { + content: "\f75b"; } + +.fa-circle-notch::before { + content: "\f1ce"; } + +.fa-tablet-screen-button::before { + content: "\f3fa"; } + +.fa-tablet-alt::before { + content: "\f3fa"; } + +.fa-paw::before { + content: "\f1b0"; } + +.fa-cloud::before { + content: "\f0c2"; } + +.fa-trowel-bricks::before { + content: "\e58a"; } + +.fa-face-flushed::before { + content: "\f579"; } + +.fa-flushed::before { + content: "\f579"; } + +.fa-hospital-user::before { + content: "\f80d"; } + +.fa-tent-arrow-left-right::before { + content: "\e57f"; } + +.fa-gavel::before { + content: "\f0e3"; } + +.fa-legal::before { + content: "\f0e3"; } + +.fa-binoculars::before { + content: "\f1e5"; } + +.fa-microphone-slash::before { + content: "\f131"; } + +.fa-box-tissue::before { + content: "\e05b"; } + +.fa-motorcycle::before { + content: "\f21c"; } + +.fa-bell-concierge::before { + content: "\f562"; } + +.fa-concierge-bell::before { + content: "\f562"; } + +.fa-pen-ruler::before { + content: "\f5ae"; } + +.fa-pencil-ruler::before { + content: "\f5ae"; } + +.fa-people-arrows::before { + content: "\e068"; } + +.fa-people-arrows-left-right::before { + content: "\e068"; } + +.fa-mars-and-venus-burst::before { + content: "\e523"; } + +.fa-square-caret-right::before { + content: "\f152"; } + +.fa-caret-square-right::before { + content: "\f152"; } + +.fa-scissors::before { + content: "\f0c4"; } + +.fa-cut::before { + content: "\f0c4"; } + +.fa-sun-plant-wilt::before { + content: "\e57a"; } + +.fa-toilets-portable::before { + content: "\e584"; } + +.fa-hockey-puck::before { + content: "\f453"; } + +.fa-table::before { + content: "\f0ce"; } + +.fa-magnifying-glass-arrow-right::before { + content: "\e521"; } + +.fa-tachograph-digital::before { + content: "\f566"; } + +.fa-digital-tachograph::before { + content: "\f566"; } + +.fa-users-slash::before { + content: "\e073"; } + +.fa-clover::before { + content: "\e139"; } + +.fa-reply::before { + content: "\f3e5"; } + +.fa-mail-reply::before { + content: "\f3e5"; } + +.fa-star-and-crescent::before { + content: "\f699"; } + +.fa-house-fire::before { + content: "\e50c"; } + +.fa-square-minus::before { + content: "\f146"; } + +.fa-minus-square::before { + content: "\f146"; } + +.fa-helicopter::before { + content: "\f533"; } + +.fa-compass::before { + content: "\f14e"; } + +.fa-square-caret-down::before { + content: "\f150"; } + +.fa-caret-square-down::before { + content: "\f150"; } + +.fa-file-circle-question::before { + content: "\e4ef"; } + +.fa-laptop-code::before { + content: "\f5fc"; } + +.fa-swatchbook::before { + content: "\f5c3"; } + +.fa-prescription-bottle::before { + content: "\f485"; } + +.fa-bars::before { + content: "\f0c9"; } + +.fa-navicon::before { + content: "\f0c9"; } + +.fa-people-group::before { + content: "\e533"; } + +.fa-hourglass-end::before { + content: "\f253"; } + +.fa-hourglass-3::before { + content: "\f253"; } + +.fa-heart-crack::before { + content: "\f7a9"; } + +.fa-heart-broken::before { + content: "\f7a9"; } + +.fa-square-up-right::before { + content: "\f360"; } + +.fa-external-link-square-alt::before { + content: "\f360"; } + +.fa-face-kiss-beam::before { + content: "\f597"; } + +.fa-kiss-beam::before { + content: "\f597"; } + +.fa-film::before { + content: "\f008"; } + +.fa-ruler-horizontal::before { + content: "\f547"; } + +.fa-people-robbery::before { + content: "\e536"; } + +.fa-lightbulb::before { + content: "\f0eb"; } + +.fa-caret-left::before { + content: "\f0d9"; } + +.fa-circle-exclamation::before { + content: "\f06a"; } + +.fa-exclamation-circle::before { + content: "\f06a"; } + +.fa-school-circle-xmark::before { + content: "\e56d"; } + +.fa-arrow-right-from-bracket::before { + content: "\f08b"; } + +.fa-sign-out::before { + content: "\f08b"; } + +.fa-circle-chevron-down::before { + content: "\f13a"; } + +.fa-chevron-circle-down::before { + content: "\f13a"; } + +.fa-unlock-keyhole::before { + content: "\f13e"; } + +.fa-unlock-alt::before { + content: "\f13e"; } + +.fa-cloud-showers-heavy::before { + content: "\f740"; } + +.fa-headphones-simple::before { + content: "\f58f"; } + +.fa-headphones-alt::before { + content: "\f58f"; } + +.fa-sitemap::before { + content: "\f0e8"; } + +.fa-circle-dollar-to-slot::before { + content: "\f4b9"; } + +.fa-donate::before { + content: "\f4b9"; } + +.fa-memory::before { + content: "\f538"; } + +.fa-road-spikes::before { + content: "\e568"; } + +.fa-fire-burner::before { + content: "\e4f1"; } + +.fa-flag::before { + content: "\f024"; } + +.fa-hanukiah::before { + content: "\f6e6"; } + +.fa-feather::before { + content: "\f52d"; } + +.fa-volume-low::before { + content: "\f027"; } + +.fa-volume-down::before { + content: "\f027"; } + +.fa-comment-slash::before { + content: "\f4b3"; } + +.fa-cloud-sun-rain::before { + content: "\f743"; } + +.fa-compress::before { + content: "\f066"; } + +.fa-wheat-awn::before { + content: "\e2cd"; } + +.fa-wheat-alt::before { + content: "\e2cd"; } + +.fa-ankh::before { + content: "\f644"; } + +.fa-hands-holding-child::before { + content: "\e4fa"; } + +.fa-asterisk::before { + content: "\2a"; } + +.fa-square-check::before { + content: "\f14a"; } + +.fa-check-square::before { + content: "\f14a"; } + +.fa-peseta-sign::before { + content: "\e221"; } + +.fa-heading::before { + content: "\f1dc"; } + +.fa-header::before { + content: "\f1dc"; } + +.fa-ghost::before { + content: "\f6e2"; } + +.fa-list::before { + content: "\f03a"; } + +.fa-list-squares::before { + content: "\f03a"; } + +.fa-square-phone-flip::before { + content: "\f87b"; } + +.fa-phone-square-alt::before { + content: "\f87b"; } + +.fa-cart-plus::before { + content: "\f217"; } + +.fa-gamepad::before { + content: "\f11b"; } + +.fa-circle-dot::before { + content: "\f192"; } + +.fa-dot-circle::before { + content: "\f192"; } + +.fa-face-dizzy::before { + content: "\f567"; } + +.fa-dizzy::before { + content: "\f567"; } + +.fa-egg::before { + content: "\f7fb"; } + +.fa-house-medical-circle-xmark::before { + content: "\e513"; } + +.fa-campground::before { + content: "\f6bb"; } + +.fa-folder-plus::before { + content: "\f65e"; } + +.fa-futbol::before { + content: "\f1e3"; } + +.fa-futbol-ball::before { + content: "\f1e3"; } + +.fa-soccer-ball::before { + content: "\f1e3"; } + +.fa-paintbrush::before { + content: "\f1fc"; } + +.fa-paint-brush::before { + content: "\f1fc"; } + +.fa-lock::before { + content: "\f023"; } + +.fa-gas-pump::before { + content: "\f52f"; } + +.fa-hot-tub-person::before { + content: "\f593"; } + +.fa-hot-tub::before { + content: "\f593"; } + +.fa-map-location::before { + content: "\f59f"; } + +.fa-map-marked::before { + content: "\f59f"; } + +.fa-house-flood-water::before { + content: "\e50e"; } + +.fa-tree::before { + content: "\f1bb"; } + +.fa-bridge-lock::before { + content: "\e4cc"; } + +.fa-sack-dollar::before { + content: "\f81d"; } + +.fa-pen-to-square::before { + content: "\f044"; } + +.fa-edit::before { + content: "\f044"; } + +.fa-car-side::before { + content: "\f5e4"; } + +.fa-share-nodes::before { + content: "\f1e0"; } + +.fa-share-alt::before { + content: "\f1e0"; } + +.fa-heart-circle-minus::before { + content: "\e4ff"; } + +.fa-hourglass-half::before { + content: "\f252"; } + +.fa-hourglass-2::before { + content: "\f252"; } + +.fa-microscope::before { + content: "\f610"; } + +.fa-sink::before { + content: "\e06d"; } + +.fa-bag-shopping::before { + content: "\f290"; } + +.fa-shopping-bag::before { + content: "\f290"; } + +.fa-arrow-down-z-a::before { + content: "\f881"; } + +.fa-sort-alpha-desc::before { + content: "\f881"; } + +.fa-sort-alpha-down-alt::before { + content: "\f881"; } + +.fa-mitten::before { + content: "\f7b5"; } + +.fa-person-rays::before { + content: "\e54d"; } + +.fa-users::before { + content: "\f0c0"; } + +.fa-eye-slash::before { + content: "\f070"; } + +.fa-flask-vial::before { + content: "\e4f3"; } + +.fa-hand::before { + content: "\f256"; } + +.fa-hand-paper::before { + content: "\f256"; } + +.fa-om::before { + content: "\f679"; } + +.fa-worm::before { + content: "\e599"; } + +.fa-house-circle-xmark::before { + content: "\e50b"; } + +.fa-plug::before { + content: "\f1e6"; } + +.fa-chevron-up::before { + content: "\f077"; } + +.fa-hand-spock::before { + content: "\f259"; } + +.fa-stopwatch::before { + content: "\f2f2"; } + +.fa-face-kiss::before { + content: "\f596"; } + +.fa-kiss::before { + content: "\f596"; } + +.fa-bridge-circle-xmark::before { + content: "\e4cb"; } + +.fa-face-grin-tongue::before { + content: "\f589"; } + +.fa-grin-tongue::before { + content: "\f589"; } + +.fa-chess-bishop::before { + content: "\f43a"; } + +.fa-face-grin-wink::before { + content: "\f58c"; } + +.fa-grin-wink::before { + content: "\f58c"; } + +.fa-ear-deaf::before { + content: "\f2a4"; } + +.fa-deaf::before { + content: "\f2a4"; } + +.fa-deafness::before { + content: "\f2a4"; } + +.fa-hard-of-hearing::before { + content: "\f2a4"; } + +.fa-road-circle-check::before { + content: "\e564"; } + +.fa-dice-five::before { + content: "\f523"; } + +.fa-square-rss::before { + content: "\f143"; } + +.fa-rss-square::before { + content: "\f143"; } + +.fa-land-mine-on::before { + content: "\e51b"; } + +.fa-i-cursor::before { + content: "\f246"; } + +.fa-stamp::before { + content: "\f5bf"; } + +.fa-stairs::before { + content: "\e289"; } + +.fa-i::before { + content: "\49"; } + +.fa-hryvnia-sign::before { + content: "\f6f2"; } + +.fa-hryvnia::before { + content: "\f6f2"; } + +.fa-pills::before { + content: "\f484"; } + +.fa-face-grin-wide::before { + content: "\f581"; } + +.fa-grin-alt::before { + content: "\f581"; } + +.fa-tooth::before { + content: "\f5c9"; } + +.fa-v::before { + content: "\56"; } + +.fa-bangladeshi-taka-sign::before { + content: "\e2e6"; } + +.fa-bicycle::before { + content: "\f206"; } + +.fa-staff-snake::before { + content: "\e579"; } + +.fa-rod-asclepius::before { + content: "\e579"; } + +.fa-rod-snake::before { + content: "\e579"; } + +.fa-staff-aesculapius::before { + content: "\e579"; } + +.fa-head-side-cough-slash::before { + content: "\e062"; } + +.fa-truck-medical::before { + content: "\f0f9"; } + +.fa-ambulance::before { + content: "\f0f9"; } + +.fa-wheat-awn-circle-exclamation::before { + content: "\e598"; } + +.fa-snowman::before { + content: "\f7d0"; } + +.fa-mortar-pestle::before { + content: "\f5a7"; } + +.fa-road-barrier::before { + content: "\e562"; } + +.fa-school::before { + content: "\f549"; } + +.fa-igloo::before { + content: "\f7ae"; } + +.fa-joint::before { + content: "\f595"; } + +.fa-angle-right::before { + content: "\f105"; } + +.fa-horse::before { + content: "\f6f0"; } + +.fa-q::before { + content: "\51"; } + +.fa-g::before { + content: "\47"; } + +.fa-notes-medical::before { + content: "\f481"; } + +.fa-temperature-half::before { + content: "\f2c9"; } + +.fa-temperature-2::before { + content: "\f2c9"; } + +.fa-thermometer-2::before { + content: "\f2c9"; } + +.fa-thermometer-half::before { + content: "\f2c9"; } + +.fa-dong-sign::before { + content: "\e169"; } + +.fa-capsules::before { + content: "\f46b"; } + +.fa-poo-storm::before { + content: "\f75a"; } + +.fa-poo-bolt::before { + content: "\f75a"; } + +.fa-face-frown-open::before { + content: "\f57a"; } + +.fa-frown-open::before { + content: "\f57a"; } + +.fa-hand-point-up::before { + content: "\f0a6"; } + +.fa-money-bill::before { + content: "\f0d6"; } + +.fa-bookmark::before { + content: "\f02e"; } + +.fa-align-justify::before { + content: "\f039"; } + +.fa-umbrella-beach::before { + content: "\f5ca"; } + +.fa-helmet-un::before { + content: "\e503"; } + +.fa-bullseye::before { + content: "\f140"; } + +.fa-bacon::before { + content: "\f7e5"; } + +.fa-hand-point-down::before { + content: "\f0a7"; } + +.fa-arrow-up-from-bracket::before { + content: "\e09a"; } + +.fa-folder::before { + content: "\f07b"; } + +.fa-folder-blank::before { + content: "\f07b"; } + +.fa-file-waveform::before { + content: "\f478"; } + +.fa-file-medical-alt::before { + content: "\f478"; } + +.fa-radiation::before { + content: "\f7b9"; } + +.fa-chart-simple::before { + content: "\e473"; } + +.fa-mars-stroke::before { + content: "\f229"; } + +.fa-vial::before { + content: "\f492"; } + +.fa-gauge::before { + content: "\f624"; } + +.fa-dashboard::before { + content: "\f624"; } + +.fa-gauge-med::before { + content: "\f624"; } + +.fa-tachometer-alt-average::before { + content: "\f624"; } + +.fa-wand-magic-sparkles::before { + content: "\e2ca"; } + +.fa-magic-wand-sparkles::before { + content: "\e2ca"; } + +.fa-e::before { + content: "\45"; } + +.fa-pen-clip::before { + content: "\f305"; } + +.fa-pen-alt::before { + content: "\f305"; } + +.fa-bridge-circle-exclamation::before { + content: "\e4ca"; } + +.fa-user::before { + content: "\f007"; } + +.fa-school-circle-check::before { + content: "\e56b"; } + +.fa-dumpster::before { + content: "\f793"; } + +.fa-van-shuttle::before { + content: "\f5b6"; } + +.fa-shuttle-van::before { + content: "\f5b6"; } + +.fa-building-user::before { + content: "\e4da"; } + +.fa-square-caret-left::before { + content: "\f191"; } + +.fa-caret-square-left::before { + content: "\f191"; } + +.fa-highlighter::before { + content: "\f591"; } + +.fa-key::before { + content: "\f084"; } + +.fa-bullhorn::before { + content: "\f0a1"; } + +.fa-globe::before { + content: "\f0ac"; } + +.fa-synagogue::before { + content: "\f69b"; } + +.fa-person-half-dress::before { + content: "\e548"; } + +.fa-road-bridge::before { + content: "\e563"; } + +.fa-location-arrow::before { + content: "\f124"; } + +.fa-c::before { + content: "\43"; } + +.fa-tablet-button::before { + content: "\f10a"; } + +.fa-building-lock::before { + content: "\e4d6"; } + +.fa-pizza-slice::before { + content: "\f818"; } + +.fa-money-bill-wave::before { + content: "\f53a"; } + +.fa-chart-area::before { + content: "\f1fe"; } + +.fa-area-chart::before { + content: "\f1fe"; } + +.fa-house-flag::before { + content: "\e50d"; } + +.fa-person-circle-minus::before { + content: "\e540"; } + +.fa-ban::before { + content: "\f05e"; } + +.fa-cancel::before { + content: "\f05e"; } + +.fa-camera-rotate::before { + content: "\e0d8"; } + +.fa-spray-can-sparkles::before { + content: "\f5d0"; } + +.fa-air-freshener::before { + content: "\f5d0"; } + +.fa-star::before { + content: "\f005"; } + +.fa-repeat::before { + content: "\f363"; } + +.fa-cross::before { + content: "\f654"; } + +.fa-box::before { + content: "\f466"; } + +.fa-venus-mars::before { + content: "\f228"; } + +.fa-arrow-pointer::before { + content: "\f245"; } + +.fa-mouse-pointer::before { + content: "\f245"; } + +.fa-maximize::before { + content: "\f31e"; } + +.fa-expand-arrows-alt::before { + content: "\f31e"; } + +.fa-charging-station::before { + content: "\f5e7"; } + +.fa-shapes::before { + content: "\f61f"; } + +.fa-triangle-circle-square::before { + content: "\f61f"; } + +.fa-shuffle::before { + content: "\f074"; } + +.fa-random::before { + content: "\f074"; } + +.fa-person-running::before { + content: "\f70c"; } + +.fa-running::before { + content: "\f70c"; } + +.fa-mobile-retro::before { + content: "\e527"; } + +.fa-grip-lines-vertical::before { + content: "\f7a5"; } + +.fa-spider::before { + content: "\f717"; } + +.fa-hands-bound::before { + content: "\e4f9"; } + +.fa-file-invoice-dollar::before { + content: "\f571"; } + +.fa-plane-circle-exclamation::before { + content: "\e556"; } + +.fa-x-ray::before { + content: "\f497"; } + +.fa-spell-check::before { + content: "\f891"; } + +.fa-slash::before { + content: "\f715"; } + +.fa-computer-mouse::before { + content: "\f8cc"; } + +.fa-mouse::before { + content: "\f8cc"; } + +.fa-arrow-right-to-bracket::before { + content: "\f090"; } + +.fa-sign-in::before { + content: "\f090"; } + +.fa-shop-slash::before { + content: "\e070"; } + +.fa-store-alt-slash::before { + content: "\e070"; } + +.fa-server::before { + content: "\f233"; } + +.fa-virus-covid-slash::before { + content: "\e4a9"; } + +.fa-shop-lock::before { + content: "\e4a5"; } + +.fa-hourglass-start::before { + content: "\f251"; } + +.fa-hourglass-1::before { + content: "\f251"; } + +.fa-blender-phone::before { + content: "\f6b6"; } + +.fa-building-wheat::before { + content: "\e4db"; } + +.fa-person-breastfeeding::before { + content: "\e53a"; } + +.fa-right-to-bracket::before { + content: "\f2f6"; } + +.fa-sign-in-alt::before { + content: "\f2f6"; } + +.fa-venus::before { + content: "\f221"; } + +.fa-passport::before { + content: "\f5ab"; } + +.fa-heart-pulse::before { + content: "\f21e"; } + +.fa-heartbeat::before { + content: "\f21e"; } + +.fa-people-carry-box::before { + content: "\f4ce"; } + +.fa-people-carry::before { + content: "\f4ce"; } + +.fa-temperature-high::before { + content: "\f769"; } + +.fa-microchip::before { + content: "\f2db"; } + +.fa-crown::before { + content: "\f521"; } + +.fa-weight-hanging::before { + content: "\f5cd"; } + +.fa-xmarks-lines::before { + content: "\e59a"; } + +.fa-file-prescription::before { + content: "\f572"; } + +.fa-weight-scale::before { + content: "\f496"; } + +.fa-weight::before { + content: "\f496"; } + +.fa-user-group::before { + content: "\f500"; } + +.fa-user-friends::before { + content: "\f500"; } + +.fa-arrow-up-a-z::before { + content: "\f15e"; } + +.fa-sort-alpha-up::before { + content: "\f15e"; } + +.fa-chess-knight::before { + content: "\f441"; } + +.fa-face-laugh-squint::before { + content: "\f59b"; } + +.fa-laugh-squint::before { + content: "\f59b"; } + +.fa-wheelchair::before { + content: "\f193"; } + +.fa-circle-arrow-up::before { + content: "\f0aa"; } + +.fa-arrow-circle-up::before { + content: "\f0aa"; } + +.fa-toggle-on::before { + content: "\f205"; } + +.fa-person-walking::before { + content: "\f554"; } + +.fa-walking::before { + content: "\f554"; } + +.fa-l::before { + content: "\4c"; } + +.fa-fire::before { + content: "\f06d"; } + +.fa-bed-pulse::before { + content: "\f487"; } + +.fa-procedures::before { + content: "\f487"; } + +.fa-shuttle-space::before { + content: "\f197"; } + +.fa-space-shuttle::before { + content: "\f197"; } + +.fa-face-laugh::before { + content: "\f599"; } + +.fa-laugh::before { + content: "\f599"; } + +.fa-folder-open::before { + content: "\f07c"; } + +.fa-heart-circle-plus::before { + content: "\e500"; } + +.fa-code-fork::before { + content: "\e13b"; } + +.fa-city::before { + content: "\f64f"; } + +.fa-microphone-lines::before { + content: "\f3c9"; } + +.fa-microphone-alt::before { + content: "\f3c9"; } + +.fa-pepper-hot::before { + content: "\f816"; } + +.fa-unlock::before { + content: "\f09c"; } + +.fa-colon-sign::before { + content: "\e140"; } + +.fa-headset::before { + content: "\f590"; } + +.fa-store-slash::before { + content: "\e071"; } + +.fa-road-circle-xmark::before { + content: "\e566"; } + +.fa-user-minus::before { + content: "\f503"; } + +.fa-mars-stroke-up::before { + content: "\f22a"; } + +.fa-mars-stroke-v::before { + content: "\f22a"; } + +.fa-champagne-glasses::before { + content: "\f79f"; } + +.fa-glass-cheers::before { + content: "\f79f"; } + +.fa-clipboard::before { + content: "\f328"; } + +.fa-house-circle-exclamation::before { + content: "\e50a"; } + +.fa-file-arrow-up::before { + content: "\f574"; } + +.fa-file-upload::before { + content: "\f574"; } + +.fa-wifi::before { + content: "\f1eb"; } + +.fa-wifi-3::before { + content: "\f1eb"; } + +.fa-wifi-strong::before { + content: "\f1eb"; } + +.fa-bath::before { + content: "\f2cd"; } + +.fa-bathtub::before { + content: "\f2cd"; } + +.fa-underline::before { + content: "\f0cd"; } + +.fa-user-pen::before { + content: "\f4ff"; } + +.fa-user-edit::before { + content: "\f4ff"; } + +.fa-signature::before { + content: "\f5b7"; } + +.fa-stroopwafel::before { + content: "\f551"; } + +.fa-bold::before { + content: "\f032"; } + +.fa-anchor-lock::before { + content: "\e4ad"; } + +.fa-building-ngo::before { + content: "\e4d7"; } + +.fa-manat-sign::before { + content: "\e1d5"; } + +.fa-not-equal::before { + content: "\f53e"; } + +.fa-border-top-left::before { + content: "\f853"; } + +.fa-border-style::before { + content: "\f853"; } + +.fa-map-location-dot::before { + content: "\f5a0"; } + +.fa-map-marked-alt::before { + content: "\f5a0"; } + +.fa-jedi::before { + content: "\f669"; } + +.fa-square-poll-vertical::before { + content: "\f681"; } + +.fa-poll::before { + content: "\f681"; } + +.fa-mug-hot::before { + content: "\f7b6"; } + +.fa-car-battery::before { + content: "\f5df"; } + +.fa-battery-car::before { + content: "\f5df"; } + +.fa-gift::before { + content: "\f06b"; } + +.fa-dice-two::before { + content: "\f528"; } + +.fa-chess-queen::before { + content: "\f445"; } + +.fa-glasses::before { + content: "\f530"; } + +.fa-chess-board::before { + content: "\f43c"; } + +.fa-building-circle-check::before { + content: "\e4d2"; } + +.fa-person-chalkboard::before { + content: "\e53d"; } + +.fa-mars-stroke-right::before { + content: "\f22b"; } + +.fa-mars-stroke-h::before { + content: "\f22b"; } + +.fa-hand-back-fist::before { + content: "\f255"; } + +.fa-hand-rock::before { + content: "\f255"; } + +.fa-square-caret-up::before { + content: "\f151"; } + +.fa-caret-square-up::before { + content: "\f151"; } + +.fa-cloud-showers-water::before { + content: "\e4e4"; } + +.fa-chart-bar::before { + content: "\f080"; } + +.fa-bar-chart::before { + content: "\f080"; } + +.fa-hands-bubbles::before { + content: "\e05e"; } + +.fa-hands-wash::before { + content: "\e05e"; } + +.fa-less-than-equal::before { + content: "\f537"; } + +.fa-train::before { + content: "\f238"; } + +.fa-eye-low-vision::before { + content: "\f2a8"; } + +.fa-low-vision::before { + content: "\f2a8"; } + +.fa-crow::before { + content: "\f520"; } + +.fa-sailboat::before { + content: "\e445"; } + +.fa-window-restore::before { + content: "\f2d2"; } + +.fa-square-plus::before { + content: "\f0fe"; } + +.fa-plus-square::before { + content: "\f0fe"; } + +.fa-torii-gate::before { + content: "\f6a1"; } + +.fa-frog::before { + content: "\f52e"; } + +.fa-bucket::before { + content: "\e4cf"; } + +.fa-image::before { + content: "\f03e"; } + +.fa-microphone::before { + content: "\f130"; } + +.fa-cow::before { + content: "\f6c8"; } + +.fa-caret-up::before { + content: "\f0d8"; } + +.fa-screwdriver::before { + content: "\f54a"; } + +.fa-folder-closed::before { + content: "\e185"; } + +.fa-house-tsunami::before { + content: "\e515"; } + +.fa-square-nfi::before { + content: "\e576"; } + +.fa-arrow-up-from-ground-water::before { + content: "\e4b5"; } + +.fa-martini-glass::before { + content: "\f57b"; } + +.fa-glass-martini-alt::before { + content: "\f57b"; } + +.fa-rotate-left::before { + content: "\f2ea"; } + +.fa-rotate-back::before { + content: "\f2ea"; } + +.fa-rotate-backward::before { + content: "\f2ea"; } + +.fa-undo-alt::before { + content: "\f2ea"; } + +.fa-table-columns::before { + content: "\f0db"; } + +.fa-columns::before { + content: "\f0db"; } + +.fa-lemon::before { + content: "\f094"; } + +.fa-head-side-mask::before { + content: "\e063"; } + +.fa-handshake::before { + content: "\f2b5"; } + +.fa-gem::before { + content: "\f3a5"; } + +.fa-dolly::before { + content: "\f472"; } + +.fa-dolly-box::before { + content: "\f472"; } + +.fa-smoking::before { + content: "\f48d"; } + +.fa-minimize::before { + content: "\f78c"; } + +.fa-compress-arrows-alt::before { + content: "\f78c"; } + +.fa-monument::before { + content: "\f5a6"; } + +.fa-snowplow::before { + content: "\f7d2"; } + +.fa-angles-right::before { + content: "\f101"; } + +.fa-angle-double-right::before { + content: "\f101"; } + +.fa-cannabis::before { + content: "\f55f"; } + +.fa-circle-play::before { + content: "\f144"; } + +.fa-play-circle::before { + content: "\f144"; } + +.fa-tablets::before { + content: "\f490"; } + +.fa-ethernet::before { + content: "\f796"; } + +.fa-euro-sign::before { + content: "\f153"; } + +.fa-eur::before { + content: "\f153"; } + +.fa-euro::before { + content: "\f153"; } + +.fa-chair::before { + content: "\f6c0"; } + +.fa-circle-check::before { + content: "\f058"; } + +.fa-check-circle::before { + content: "\f058"; } + +.fa-circle-stop::before { + content: "\f28d"; } + +.fa-stop-circle::before { + content: "\f28d"; } + +.fa-compass-drafting::before { + content: "\f568"; } + +.fa-drafting-compass::before { + content: "\f568"; } + +.fa-plate-wheat::before { + content: "\e55a"; } + +.fa-icicles::before { + content: "\f7ad"; } + +.fa-person-shelter::before { + content: "\e54f"; } + +.fa-neuter::before { + content: "\f22c"; } + +.fa-id-badge::before { + content: "\f2c1"; } + +.fa-marker::before { + content: "\f5a1"; } + +.fa-face-laugh-beam::before { + content: "\f59a"; } + +.fa-laugh-beam::before { + content: "\f59a"; } + +.fa-helicopter-symbol::before { + content: "\e502"; } + +.fa-universal-access::before { + content: "\f29a"; } + +.fa-circle-chevron-up::before { + content: "\f139"; } + +.fa-chevron-circle-up::before { + content: "\f139"; } + +.fa-lari-sign::before { + content: "\e1c8"; } + +.fa-volcano::before { + content: "\f770"; } + +.fa-person-walking-dashed-line-arrow-right::before { + content: "\e553"; } + +.fa-sterling-sign::before { + content: "\f154"; } + +.fa-gbp::before { + content: "\f154"; } + +.fa-pound-sign::before { + content: "\f154"; } + +.fa-viruses::before { + content: "\e076"; } + +.fa-square-person-confined::before { + content: "\e577"; } + +.fa-user-tie::before { + content: "\f508"; } + +.fa-arrow-down-long::before { + content: "\f175"; } + +.fa-long-arrow-down::before { + content: "\f175"; } + +.fa-tent-arrow-down-to-line::before { + content: "\e57e"; } + +.fa-certificate::before { + content: "\f0a3"; } + +.fa-reply-all::before { + content: "\f122"; } + +.fa-mail-reply-all::before { + content: "\f122"; } + +.fa-suitcase::before { + content: "\f0f2"; } + +.fa-person-skating::before { + content: "\f7c5"; } + +.fa-skating::before { + content: "\f7c5"; } + +.fa-filter-circle-dollar::before { + content: "\f662"; } + +.fa-funnel-dollar::before { + content: "\f662"; } + +.fa-camera-retro::before { + content: "\f083"; } + +.fa-circle-arrow-down::before { + content: "\f0ab"; } + +.fa-arrow-circle-down::before { + content: "\f0ab"; } + +.fa-file-import::before { + content: "\f56f"; } + +.fa-arrow-right-to-file::before { + content: "\f56f"; } + +.fa-square-arrow-up-right::before { + content: "\f14c"; } + +.fa-external-link-square::before { + content: "\f14c"; } + +.fa-box-open::before { + content: "\f49e"; } + +.fa-scroll::before { + content: "\f70e"; } + +.fa-spa::before { + content: "\f5bb"; } + +.fa-location-pin-lock::before { + content: "\e51f"; } + +.fa-pause::before { + content: "\f04c"; } + +.fa-hill-avalanche::before { + content: "\e507"; } + +.fa-temperature-empty::before { + content: "\f2cb"; } + +.fa-temperature-0::before { + content: "\f2cb"; } + +.fa-thermometer-0::before { + content: "\f2cb"; } + +.fa-thermometer-empty::before { + content: "\f2cb"; } + +.fa-bomb::before { + content: "\f1e2"; } + +.fa-registered::before { + content: "\f25d"; } + +.fa-address-card::before { + content: "\f2bb"; } + +.fa-contact-card::before { + content: "\f2bb"; } + +.fa-vcard::before { + content: "\f2bb"; } + +.fa-scale-unbalanced-flip::before { + content: "\f516"; } + +.fa-balance-scale-right::before { + content: "\f516"; } + +.fa-subscript::before { + content: "\f12c"; } + +.fa-diamond-turn-right::before { + content: "\f5eb"; } + +.fa-directions::before { + content: "\f5eb"; } + +.fa-burst::before { + content: "\e4dc"; } + +.fa-house-laptop::before { + content: "\e066"; } + +.fa-laptop-house::before { + content: "\e066"; } + +.fa-face-tired::before { + content: "\f5c8"; } + +.fa-tired::before { + content: "\f5c8"; } + +.fa-money-bills::before { + content: "\e1f3"; } + +.fa-smog::before { + content: "\f75f"; } + +.fa-crutch::before { + content: "\f7f7"; } + +.fa-cloud-arrow-up::before { + content: "\f0ee"; } + +.fa-cloud-upload::before { + content: "\f0ee"; } + +.fa-cloud-upload-alt::before { + content: "\f0ee"; } + +.fa-palette::before { + content: "\f53f"; } + +.fa-arrows-turn-right::before { + content: "\e4c0"; } + +.fa-vest::before { + content: "\e085"; } + +.fa-ferry::before { + content: "\e4ea"; } + +.fa-arrows-down-to-people::before { + content: "\e4b9"; } + +.fa-seedling::before { + content: "\f4d8"; } + +.fa-sprout::before { + content: "\f4d8"; } + +.fa-left-right::before { + content: "\f337"; } + +.fa-arrows-alt-h::before { + content: "\f337"; } + +.fa-boxes-packing::before { + content: "\e4c7"; } + +.fa-circle-arrow-left::before { + content: "\f0a8"; } + +.fa-arrow-circle-left::before { + content: "\f0a8"; } + +.fa-group-arrows-rotate::before { + content: "\e4f6"; } + +.fa-bowl-food::before { + content: "\e4c6"; } + +.fa-candy-cane::before { + content: "\f786"; } + +.fa-arrow-down-wide-short::before { + content: "\f160"; } + +.fa-sort-amount-asc::before { + content: "\f160"; } + +.fa-sort-amount-down::before { + content: "\f160"; } + +.fa-cloud-bolt::before { + content: "\f76c"; } + +.fa-thunderstorm::before { + content: "\f76c"; } + +.fa-text-slash::before { + content: "\f87d"; } + +.fa-remove-format::before { + content: "\f87d"; } + +.fa-face-smile-wink::before { + content: "\f4da"; } + +.fa-smile-wink::before { + content: "\f4da"; } + +.fa-file-word::before { + content: "\f1c2"; } + +.fa-file-powerpoint::before { + content: "\f1c4"; } + +.fa-arrows-left-right::before { + content: "\f07e"; } + +.fa-arrows-h::before { + content: "\f07e"; } + +.fa-house-lock::before { + content: "\e510"; } + +.fa-cloud-arrow-down::before { + content: "\f0ed"; } + +.fa-cloud-download::before { + content: "\f0ed"; } + +.fa-cloud-download-alt::before { + content: "\f0ed"; } + +.fa-children::before { + content: "\e4e1"; } + +.fa-chalkboard::before { + content: "\f51b"; } + +.fa-blackboard::before { + content: "\f51b"; } + +.fa-user-large-slash::before { + content: "\f4fa"; } + +.fa-user-alt-slash::before { + content: "\f4fa"; } + +.fa-envelope-open::before { + content: "\f2b6"; } + +.fa-handshake-simple-slash::before { + content: "\e05f"; } + +.fa-handshake-alt-slash::before { + content: "\e05f"; } + +.fa-mattress-pillow::before { + content: "\e525"; } + +.fa-guarani-sign::before { + content: "\e19a"; } + +.fa-arrows-rotate::before { + content: "\f021"; } + +.fa-refresh::before { + content: "\f021"; } + +.fa-sync::before { + content: "\f021"; } + +.fa-fire-extinguisher::before { + content: "\f134"; } + +.fa-cruzeiro-sign::before { + content: "\e152"; } + +.fa-greater-than-equal::before { + content: "\f532"; } + +.fa-shield-halved::before { + content: "\f3ed"; } + +.fa-shield-alt::before { + content: "\f3ed"; } + +.fa-book-atlas::before { + content: "\f558"; } + +.fa-atlas::before { + content: "\f558"; } + +.fa-virus::before { + content: "\e074"; } + +.fa-envelope-circle-check::before { + content: "\e4e8"; } + +.fa-layer-group::before { + content: "\f5fd"; } + +.fa-arrows-to-dot::before { + content: "\e4be"; } + +.fa-archway::before { + content: "\f557"; } + +.fa-heart-circle-check::before { + content: "\e4fd"; } + +.fa-house-chimney-crack::before { + content: "\f6f1"; } + +.fa-house-damage::before { + content: "\f6f1"; } + +.fa-file-zipper::before { + content: "\f1c6"; } + +.fa-file-archive::before { + content: "\f1c6"; } + +.fa-square::before { + content: "\f0c8"; } + +.fa-martini-glass-empty::before { + content: "\f000"; } + +.fa-glass-martini::before { + content: "\f000"; } + +.fa-couch::before { + content: "\f4b8"; } + +.fa-cedi-sign::before { + content: "\e0df"; } + +.fa-italic::before { + content: "\f033"; } + +.fa-table-cells-column-lock::before { + content: "\e678"; } + +.fa-church::before { + content: "\f51d"; } + +.fa-comments-dollar::before { + content: "\f653"; } + +.fa-democrat::before { + content: "\f747"; } + +.fa-z::before { + content: "\5a"; } + +.fa-person-skiing::before { + content: "\f7c9"; } + +.fa-skiing::before { + content: "\f7c9"; } + +.fa-road-lock::before { + content: "\e567"; } + +.fa-a::before { + content: "\41"; } + +.fa-temperature-arrow-down::before { + content: "\e03f"; } + +.fa-temperature-down::before { + content: "\e03f"; } + +.fa-feather-pointed::before { + content: "\f56b"; } + +.fa-feather-alt::before { + content: "\f56b"; } + +.fa-p::before { + content: "\50"; } + +.fa-snowflake::before { + content: "\f2dc"; } + +.fa-newspaper::before { + content: "\f1ea"; } + +.fa-rectangle-ad::before { + content: "\f641"; } + +.fa-ad::before { + content: "\f641"; } + +.fa-circle-arrow-right::before { + content: "\f0a9"; } + +.fa-arrow-circle-right::before { + content: "\f0a9"; } + +.fa-filter-circle-xmark::before { + content: "\e17b"; } + +.fa-locust::before { + content: "\e520"; } + +.fa-sort::before { + content: "\f0dc"; } + +.fa-unsorted::before { + content: "\f0dc"; } + +.fa-list-ol::before { + content: "\f0cb"; } + +.fa-list-1-2::before { + content: "\f0cb"; } + +.fa-list-numeric::before { + content: "\f0cb"; } + +.fa-person-dress-burst::before { + content: "\e544"; } + +.fa-money-check-dollar::before { + content: "\f53d"; } + +.fa-money-check-alt::before { + content: "\f53d"; } + +.fa-vector-square::before { + content: "\f5cb"; } + +.fa-bread-slice::before { + content: "\f7ec"; } + +.fa-language::before { + content: "\f1ab"; } + +.fa-face-kiss-wink-heart::before { + content: "\f598"; } + +.fa-kiss-wink-heart::before { + content: "\f598"; } + +.fa-filter::before { + content: "\f0b0"; } + +.fa-question::before { + content: "\3f"; } + +.fa-file-signature::before { + content: "\f573"; } + +.fa-up-down-left-right::before { + content: "\f0b2"; } + +.fa-arrows-alt::before { + content: "\f0b2"; } + +.fa-house-chimney-user::before { + content: "\e065"; } + +.fa-hand-holding-heart::before { + content: "\f4be"; } + +.fa-puzzle-piece::before { + content: "\f12e"; } + +.fa-money-check::before { + content: "\f53c"; } + +.fa-star-half-stroke::before { + content: "\f5c0"; } + +.fa-star-half-alt::before { + content: "\f5c0"; } + +.fa-code::before { + content: "\f121"; } + +.fa-whiskey-glass::before { + content: "\f7a0"; } + +.fa-glass-whiskey::before { + content: "\f7a0"; } + +.fa-building-circle-exclamation::before { + content: "\e4d3"; } + +.fa-magnifying-glass-chart::before { + content: "\e522"; } + +.fa-arrow-up-right-from-square::before { + content: "\f08e"; } + +.fa-external-link::before { + content: "\f08e"; } + +.fa-cubes-stacked::before { + content: "\e4e6"; } + +.fa-won-sign::before { + content: "\f159"; } + +.fa-krw::before { + content: "\f159"; } + +.fa-won::before { + content: "\f159"; } + +.fa-virus-covid::before { + content: "\e4a8"; } + +.fa-austral-sign::before { + content: "\e0a9"; } + +.fa-f::before { + content: "\46"; } + +.fa-leaf::before { + content: "\f06c"; } + +.fa-road::before { + content: "\f018"; } + +.fa-taxi::before { + content: "\f1ba"; } + +.fa-cab::before { + content: "\f1ba"; } + +.fa-person-circle-plus::before { + content: "\e541"; } + +.fa-chart-pie::before { + content: "\f200"; } + +.fa-pie-chart::before { + content: "\f200"; } + +.fa-bolt-lightning::before { + content: "\e0b7"; } + +.fa-sack-xmark::before { + content: "\e56a"; } + +.fa-file-excel::before { + content: "\f1c3"; } + +.fa-file-contract::before { + content: "\f56c"; } + +.fa-fish-fins::before { + content: "\e4f2"; } + +.fa-building-flag::before { + content: "\e4d5"; } + +.fa-face-grin-beam::before { + content: "\f582"; } + +.fa-grin-beam::before { + content: "\f582"; } + +.fa-object-ungroup::before { + content: "\f248"; } + +.fa-poop::before { + content: "\f619"; } + +.fa-location-pin::before { + content: "\f041"; } + +.fa-map-marker::before { + content: "\f041"; } + +.fa-kaaba::before { + content: "\f66b"; } + +.fa-toilet-paper::before { + content: "\f71e"; } + +.fa-helmet-safety::before { + content: "\f807"; } + +.fa-hard-hat::before { + content: "\f807"; } + +.fa-hat-hard::before { + content: "\f807"; } + +.fa-eject::before { + content: "\f052"; } + +.fa-circle-right::before { + content: "\f35a"; } + +.fa-arrow-alt-circle-right::before { + content: "\f35a"; } + +.fa-plane-circle-check::before { + content: "\e555"; } + +.fa-face-rolling-eyes::before { + content: "\f5a5"; } + +.fa-meh-rolling-eyes::before { + content: "\f5a5"; } + +.fa-object-group::before { + content: "\f247"; } + +.fa-chart-line::before { + content: "\f201"; } + +.fa-line-chart::before { + content: "\f201"; } + +.fa-mask-ventilator::before { + content: "\e524"; } + +.fa-arrow-right::before { + content: "\f061"; } + +.fa-signs-post::before { + content: "\f277"; } + +.fa-map-signs::before { + content: "\f277"; } + +.fa-cash-register::before { + content: "\f788"; } + +.fa-person-circle-question::before { + content: "\e542"; } + +.fa-h::before { + content: "\48"; } + +.fa-tarp::before { + content: "\e57b"; } + +.fa-screwdriver-wrench::before { + content: "\f7d9"; } + +.fa-tools::before { + content: "\f7d9"; } + +.fa-arrows-to-eye::before { + content: "\e4bf"; } + +.fa-plug-circle-bolt::before { + content: "\e55b"; } + +.fa-heart::before { + content: "\f004"; } + +.fa-mars-and-venus::before { + content: "\f224"; } + +.fa-house-user::before { + content: "\e1b0"; } + +.fa-home-user::before { + content: "\e1b0"; } + +.fa-dumpster-fire::before { + content: "\f794"; } + +.fa-house-crack::before { + content: "\e3b1"; } + +.fa-martini-glass-citrus::before { + content: "\f561"; } + +.fa-cocktail::before { + content: "\f561"; } + +.fa-face-surprise::before { + content: "\f5c2"; } + +.fa-surprise::before { + content: "\f5c2"; } + +.fa-bottle-water::before { + content: "\e4c5"; } + +.fa-circle-pause::before { + content: "\f28b"; } + +.fa-pause-circle::before { + content: "\f28b"; } + +.fa-toilet-paper-slash::before { + content: "\e072"; } + +.fa-apple-whole::before { + content: "\f5d1"; } + +.fa-apple-alt::before { + content: "\f5d1"; } + +.fa-kitchen-set::before { + content: "\e51a"; } + +.fa-r::before { + content: "\52"; } + +.fa-temperature-quarter::before { + content: "\f2ca"; } + +.fa-temperature-1::before { + content: "\f2ca"; } + +.fa-thermometer-1::before { + content: "\f2ca"; } + +.fa-thermometer-quarter::before { + content: "\f2ca"; } + +.fa-cube::before { + content: "\f1b2"; } + +.fa-bitcoin-sign::before { + content: "\e0b4"; } + +.fa-shield-dog::before { + content: "\e573"; } + +.fa-solar-panel::before { + content: "\f5ba"; } + +.fa-lock-open::before { + content: "\f3c1"; } + +.fa-elevator::before { + content: "\e16d"; } + +.fa-money-bill-transfer::before { + content: "\e528"; } + +.fa-money-bill-trend-up::before { + content: "\e529"; } + +.fa-house-flood-water-circle-arrow-right::before { + content: "\e50f"; } + +.fa-square-poll-horizontal::before { + content: "\f682"; } + +.fa-poll-h::before { + content: "\f682"; } + +.fa-circle::before { + content: "\f111"; } + +.fa-backward-fast::before { + content: "\f049"; } + +.fa-fast-backward::before { + content: "\f049"; } + +.fa-recycle::before { + content: "\f1b8"; } + +.fa-user-astronaut::before { + content: "\f4fb"; } + +.fa-plane-slash::before { + content: "\e069"; } + +.fa-trademark::before { + content: "\f25c"; } + +.fa-basketball::before { + content: "\f434"; } + +.fa-basketball-ball::before { + content: "\f434"; } + +.fa-satellite-dish::before { + content: "\f7c0"; } + +.fa-circle-up::before { + content: "\f35b"; } + +.fa-arrow-alt-circle-up::before { + content: "\f35b"; } + +.fa-mobile-screen-button::before { + content: "\f3cd"; } + +.fa-mobile-alt::before { + content: "\f3cd"; } + +.fa-volume-high::before { + content: "\f028"; } + +.fa-volume-up::before { + content: "\f028"; } + +.fa-users-rays::before { + content: "\e593"; } + +.fa-wallet::before { + content: "\f555"; } + +.fa-clipboard-check::before { + content: "\f46c"; } + +.fa-file-audio::before { + content: "\f1c7"; } + +.fa-burger::before { + content: "\f805"; } + +.fa-hamburger::before { + content: "\f805"; } + +.fa-wrench::before { + content: "\f0ad"; } + +.fa-bugs::before { + content: "\e4d0"; } + +.fa-rupee-sign::before { + content: "\f156"; } + +.fa-rupee::before { + content: "\f156"; } + +.fa-file-image::before { + content: "\f1c5"; } + +.fa-circle-question::before { + content: "\f059"; } + +.fa-question-circle::before { + content: "\f059"; } + +.fa-plane-departure::before { + content: "\f5b0"; } + +.fa-handshake-slash::before { + content: "\e060"; } + +.fa-book-bookmark::before { + content: "\e0bb"; } + +.fa-code-branch::before { + content: "\f126"; } + +.fa-hat-cowboy::before { + content: "\f8c0"; } + +.fa-bridge::before { + content: "\e4c8"; } + +.fa-phone-flip::before { + content: "\f879"; } + +.fa-phone-alt::before { + content: "\f879"; } + +.fa-truck-front::before { + content: "\e2b7"; } + +.fa-cat::before { + content: "\f6be"; } + +.fa-anchor-circle-exclamation::before { + content: "\e4ab"; } + +.fa-truck-field::before { + content: "\e58d"; } + +.fa-route::before { + content: "\f4d7"; } + +.fa-clipboard-question::before { + content: "\e4e3"; } + +.fa-panorama::before { + content: "\e209"; } + +.fa-comment-medical::before { + content: "\f7f5"; } + +.fa-teeth-open::before { + content: "\f62f"; } + +.fa-file-circle-minus::before { + content: "\e4ed"; } + +.fa-tags::before { + content: "\f02c"; } + +.fa-wine-glass::before { + content: "\f4e3"; } + +.fa-forward-fast::before { + content: "\f050"; } + +.fa-fast-forward::before { + content: "\f050"; } + +.fa-face-meh-blank::before { + content: "\f5a4"; } + +.fa-meh-blank::before { + content: "\f5a4"; } + +.fa-square-parking::before { + content: "\f540"; } + +.fa-parking::before { + content: "\f540"; } + +.fa-house-signal::before { + content: "\e012"; } + +.fa-bars-progress::before { + content: "\f828"; } + +.fa-tasks-alt::before { + content: "\f828"; } + +.fa-faucet-drip::before { + content: "\e006"; } + +.fa-cart-flatbed::before { + content: "\f474"; } + +.fa-dolly-flatbed::before { + content: "\f474"; } + +.fa-ban-smoking::before { + content: "\f54d"; } + +.fa-smoking-ban::before { + content: "\f54d"; } + +.fa-terminal::before { + content: "\f120"; } + +.fa-mobile-button::before { + content: "\f10b"; } + +.fa-house-medical-flag::before { + content: "\e514"; } + +.fa-basket-shopping::before { + content: "\f291"; } + +.fa-shopping-basket::before { + content: "\f291"; } + +.fa-tape::before { + content: "\f4db"; } + +.fa-bus-simple::before { + content: "\f55e"; } + +.fa-bus-alt::before { + content: "\f55e"; } + +.fa-eye::before { + content: "\f06e"; } + +.fa-face-sad-cry::before { + content: "\f5b3"; } + +.fa-sad-cry::before { + content: "\f5b3"; } + +.fa-audio-description::before { + content: "\f29e"; } + +.fa-person-military-to-person::before { + content: "\e54c"; } + +.fa-file-shield::before { + content: "\e4f0"; } + +.fa-user-slash::before { + content: "\f506"; } + +.fa-pen::before { + content: "\f304"; } + +.fa-tower-observation::before { + content: "\e586"; } + +.fa-file-code::before { + content: "\f1c9"; } + +.fa-signal::before { + content: "\f012"; } + +.fa-signal-5::before { + content: "\f012"; } + +.fa-signal-perfect::before { + content: "\f012"; } + +.fa-bus::before { + content: "\f207"; } + +.fa-heart-circle-xmark::before { + content: "\e501"; } + +.fa-house-chimney::before { + content: "\e3af"; } + +.fa-home-lg::before { + content: "\e3af"; } + +.fa-window-maximize::before { + content: "\f2d0"; } + +.fa-face-frown::before { + content: "\f119"; } + +.fa-frown::before { + content: "\f119"; } + +.fa-prescription::before { + content: "\f5b1"; } + +.fa-shop::before { + content: "\f54f"; } + +.fa-store-alt::before { + content: "\f54f"; } + +.fa-floppy-disk::before { + content: "\f0c7"; } + +.fa-save::before { + content: "\f0c7"; } + +.fa-vihara::before { + content: "\f6a7"; } + +.fa-scale-unbalanced::before { + content: "\f515"; } + +.fa-balance-scale-left::before { + content: "\f515"; } + +.fa-sort-up::before { + content: "\f0de"; } + +.fa-sort-asc::before { + content: "\f0de"; } + +.fa-comment-dots::before { + content: "\f4ad"; } + +.fa-commenting::before { + content: "\f4ad"; } + +.fa-plant-wilt::before { + content: "\e5aa"; } + +.fa-diamond::before { + content: "\f219"; } + +.fa-face-grin-squint::before { + content: "\f585"; } + +.fa-grin-squint::before { + content: "\f585"; } + +.fa-hand-holding-dollar::before { + content: "\f4c0"; } + +.fa-hand-holding-usd::before { + content: "\f4c0"; } + +.fa-bacterium::before { + content: "\e05a"; } + +.fa-hand-pointer::before { + content: "\f25a"; } + +.fa-drum-steelpan::before { + content: "\f56a"; } + +.fa-hand-scissors::before { + content: "\f257"; } + +.fa-hands-praying::before { + content: "\f684"; } + +.fa-praying-hands::before { + content: "\f684"; } + +.fa-arrow-rotate-right::before { + content: "\f01e"; } + +.fa-arrow-right-rotate::before { + content: "\f01e"; } + +.fa-arrow-rotate-forward::before { + content: "\f01e"; } + +.fa-redo::before { + content: "\f01e"; } + +.fa-biohazard::before { + content: "\f780"; } + +.fa-location-crosshairs::before { + content: "\f601"; } + +.fa-location::before { + content: "\f601"; } + +.fa-mars-double::before { + content: "\f227"; } + +.fa-child-dress::before { + content: "\e59c"; } + +.fa-users-between-lines::before { + content: "\e591"; } + +.fa-lungs-virus::before { + content: "\e067"; } + +.fa-face-grin-tears::before { + content: "\f588"; } + +.fa-grin-tears::before { + content: "\f588"; } + +.fa-phone::before { + content: "\f095"; } + +.fa-calendar-xmark::before { + content: "\f273"; } + +.fa-calendar-times::before { + content: "\f273"; } + +.fa-child-reaching::before { + content: "\e59d"; } + +.fa-head-side-virus::before { + content: "\e064"; } + +.fa-user-gear::before { + content: "\f4fe"; } + +.fa-user-cog::before { + content: "\f4fe"; } + +.fa-arrow-up-1-9::before { + content: "\f163"; } + +.fa-sort-numeric-up::before { + content: "\f163"; } + +.fa-door-closed::before { + content: "\f52a"; } + +.fa-shield-virus::before { + content: "\e06c"; } + +.fa-dice-six::before { + content: "\f526"; } + +.fa-mosquito-net::before { + content: "\e52c"; } + +.fa-bridge-water::before { + content: "\e4ce"; } + +.fa-person-booth::before { + content: "\f756"; } + +.fa-text-width::before { + content: "\f035"; } + +.fa-hat-wizard::before { + content: "\f6e8"; } + +.fa-pen-fancy::before { + content: "\f5ac"; } + +.fa-person-digging::before { + content: "\f85e"; } + +.fa-digging::before { + content: "\f85e"; } + +.fa-trash::before { + content: "\f1f8"; } + +.fa-gauge-simple::before { + content: "\f629"; } + +.fa-gauge-simple-med::before { + content: "\f629"; } + +.fa-tachometer-average::before { + content: "\f629"; } + +.fa-book-medical::before { + content: "\f7e6"; } + +.fa-poo::before { + content: "\f2fe"; } + +.fa-quote-right::before { + content: "\f10e"; } + +.fa-quote-right-alt::before { + content: "\f10e"; } + +.fa-shirt::before { + content: "\f553"; } + +.fa-t-shirt::before { + content: "\f553"; } + +.fa-tshirt::before { + content: "\f553"; } + +.fa-cubes::before { + content: "\f1b3"; } + +.fa-divide::before { + content: "\f529"; } + +.fa-tenge-sign::before { + content: "\f7d7"; } + +.fa-tenge::before { + content: "\f7d7"; } + +.fa-headphones::before { + content: "\f025"; } + +.fa-hands-holding::before { + content: "\f4c2"; } + +.fa-hands-clapping::before { + content: "\e1a8"; } + +.fa-republican::before { + content: "\f75e"; } + +.fa-arrow-left::before { + content: "\f060"; } + +.fa-person-circle-xmark::before { + content: "\e543"; } + +.fa-ruler::before { + content: "\f545"; } + +.fa-align-left::before { + content: "\f036"; } + +.fa-dice-d6::before { + content: "\f6d1"; } + +.fa-restroom::before { + content: "\f7bd"; } + +.fa-j::before { + content: "\4a"; } + +.fa-users-viewfinder::before { + content: "\e595"; } + +.fa-file-video::before { + content: "\f1c8"; } + +.fa-up-right-from-square::before { + content: "\f35d"; } + +.fa-external-link-alt::before { + content: "\f35d"; } + +.fa-table-cells::before { + content: "\f00a"; } + +.fa-th::before { + content: "\f00a"; } + +.fa-file-pdf::before { + content: "\f1c1"; } + +.fa-book-bible::before { + content: "\f647"; } + +.fa-bible::before { + content: "\f647"; } + +.fa-o::before { + content: "\4f"; } + +.fa-suitcase-medical::before { + content: "\f0fa"; } + +.fa-medkit::before { + content: "\f0fa"; } + +.fa-user-secret::before { + content: "\f21b"; } + +.fa-otter::before { + content: "\f700"; } + +.fa-person-dress::before { + content: "\f182"; } + +.fa-female::before { + content: "\f182"; } + +.fa-comment-dollar::before { + content: "\f651"; } + +.fa-business-time::before { + content: "\f64a"; } + +.fa-briefcase-clock::before { + content: "\f64a"; } + +.fa-table-cells-large::before { + content: "\f009"; } + +.fa-th-large::before { + content: "\f009"; } + +.fa-book-tanakh::before { + content: "\f827"; } + +.fa-tanakh::before { + content: "\f827"; } + +.fa-phone-volume::before { + content: "\f2a0"; } + +.fa-volume-control-phone::before { + content: "\f2a0"; } + +.fa-hat-cowboy-side::before { + content: "\f8c1"; } + +.fa-clipboard-user::before { + content: "\f7f3"; } + +.fa-child::before { + content: "\f1ae"; } + +.fa-lira-sign::before { + content: "\f195"; } + +.fa-satellite::before { + content: "\f7bf"; } + +.fa-plane-lock::before { + content: "\e558"; } + +.fa-tag::before { + content: "\f02b"; } + +.fa-comment::before { + content: "\f075"; } + +.fa-cake-candles::before { + content: "\f1fd"; } + +.fa-birthday-cake::before { + content: "\f1fd"; } + +.fa-cake::before { + content: "\f1fd"; } + +.fa-envelope::before { + content: "\f0e0"; } + +.fa-angles-up::before { + content: "\f102"; } + +.fa-angle-double-up::before { + content: "\f102"; } + +.fa-paperclip::before { + content: "\f0c6"; } + +.fa-arrow-right-to-city::before { + content: "\e4b3"; } + +.fa-ribbon::before { + content: "\f4d6"; } + +.fa-lungs::before { + content: "\f604"; } + +.fa-arrow-up-9-1::before { + content: "\f887"; } + +.fa-sort-numeric-up-alt::before { + content: "\f887"; } + +.fa-litecoin-sign::before { + content: "\e1d3"; } + +.fa-border-none::before { + content: "\f850"; } + +.fa-circle-nodes::before { + content: "\e4e2"; } + +.fa-parachute-box::before { + content: "\f4cd"; } + +.fa-indent::before { + content: "\f03c"; } + +.fa-truck-field-un::before { + content: "\e58e"; } + +.fa-hourglass::before { + content: "\f254"; } + +.fa-hourglass-empty::before { + content: "\f254"; } + +.fa-mountain::before { + content: "\f6fc"; } + +.fa-user-doctor::before { + content: "\f0f0"; } + +.fa-user-md::before { + content: "\f0f0"; } + +.fa-circle-info::before { + content: "\f05a"; } + +.fa-info-circle::before { + content: "\f05a"; } + +.fa-cloud-meatball::before { + content: "\f73b"; } + +.fa-camera::before { + content: "\f030"; } + +.fa-camera-alt::before { + content: "\f030"; } + +.fa-square-virus::before { + content: "\e578"; } + +.fa-meteor::before { + content: "\f753"; } + +.fa-car-on::before { + content: "\e4dd"; } + +.fa-sleigh::before { + content: "\f7cc"; } + +.fa-arrow-down-1-9::before { + content: "\f162"; } + +.fa-sort-numeric-asc::before { + content: "\f162"; } + +.fa-sort-numeric-down::before { + content: "\f162"; } + +.fa-hand-holding-droplet::before { + content: "\f4c1"; } + +.fa-hand-holding-water::before { + content: "\f4c1"; } + +.fa-water::before { + content: "\f773"; } + +.fa-calendar-check::before { + content: "\f274"; } + +.fa-braille::before { + content: "\f2a1"; } + +.fa-prescription-bottle-medical::before { + content: "\f486"; } + +.fa-prescription-bottle-alt::before { + content: "\f486"; } + +.fa-landmark::before { + content: "\f66f"; } + +.fa-truck::before { + content: "\f0d1"; } + +.fa-crosshairs::before { + content: "\f05b"; } + +.fa-person-cane::before { + content: "\e53c"; } + +.fa-tent::before { + content: "\e57d"; } + +.fa-vest-patches::before { + content: "\e086"; } + +.fa-check-double::before { + content: "\f560"; } + +.fa-arrow-down-a-z::before { + content: "\f15d"; } + +.fa-sort-alpha-asc::before { + content: "\f15d"; } + +.fa-sort-alpha-down::before { + content: "\f15d"; } + +.fa-money-bill-wheat::before { + content: "\e52a"; } + +.fa-cookie::before { + content: "\f563"; } + +.fa-arrow-rotate-left::before { + content: "\f0e2"; } + +.fa-arrow-left-rotate::before { + content: "\f0e2"; } + +.fa-arrow-rotate-back::before { + content: "\f0e2"; } + +.fa-arrow-rotate-backward::before { + content: "\f0e2"; } + +.fa-undo::before { + content: "\f0e2"; } + +.fa-hard-drive::before { + content: "\f0a0"; } + +.fa-hdd::before { + content: "\f0a0"; } + +.fa-face-grin-squint-tears::before { + content: "\f586"; } + +.fa-grin-squint-tears::before { + content: "\f586"; } + +.fa-dumbbell::before { + content: "\f44b"; } + +.fa-rectangle-list::before { + content: "\f022"; } + +.fa-list-alt::before { + content: "\f022"; } + +.fa-tarp-droplet::before { + content: "\e57c"; } + +.fa-house-medical-circle-check::before { + content: "\e511"; } + +.fa-person-skiing-nordic::before { + content: "\f7ca"; } + +.fa-skiing-nordic::before { + content: "\f7ca"; } + +.fa-calendar-plus::before { + content: "\f271"; } + +.fa-plane-arrival::before { + content: "\f5af"; } + +.fa-circle-left::before { + content: "\f359"; } + +.fa-arrow-alt-circle-left::before { + content: "\f359"; } + +.fa-train-subway::before { + content: "\f239"; } + +.fa-subway::before { + content: "\f239"; } + +.fa-chart-gantt::before { + content: "\e0e4"; } + +.fa-indian-rupee-sign::before { + content: "\e1bc"; } + +.fa-indian-rupee::before { + content: "\e1bc"; } + +.fa-inr::before { + content: "\e1bc"; } + +.fa-crop-simple::before { + content: "\f565"; } + +.fa-crop-alt::before { + content: "\f565"; } + +.fa-money-bill-1::before { + content: "\f3d1"; } + +.fa-money-bill-alt::before { + content: "\f3d1"; } + +.fa-left-long::before { + content: "\f30a"; } + +.fa-long-arrow-alt-left::before { + content: "\f30a"; } + +.fa-dna::before { + content: "\f471"; } + +.fa-virus-slash::before { + content: "\e075"; } + +.fa-minus::before { + content: "\f068"; } + +.fa-subtract::before { + content: "\f068"; } + +.fa-chess::before { + content: "\f439"; } + +.fa-arrow-left-long::before { + content: "\f177"; } + +.fa-long-arrow-left::before { + content: "\f177"; } + +.fa-plug-circle-check::before { + content: "\e55c"; } + +.fa-street-view::before { + content: "\f21d"; } + +.fa-franc-sign::before { + content: "\e18f"; } + +.fa-volume-off::before { + content: "\f026"; } + +.fa-hands-asl-interpreting::before { + content: "\f2a3"; } + +.fa-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-asl-interpreting::before { + content: "\f2a3"; } + +.fa-hands-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-gear::before { + content: "\f013"; } + +.fa-cog::before { + content: "\f013"; } + +.fa-droplet-slash::before { + content: "\f5c7"; } + +.fa-tint-slash::before { + content: "\f5c7"; } + +.fa-mosque::before { + content: "\f678"; } + +.fa-mosquito::before { + content: "\e52b"; } + +.fa-star-of-david::before { + content: "\f69a"; } + +.fa-person-military-rifle::before { + content: "\e54b"; } + +.fa-cart-shopping::before { + content: "\f07a"; } + +.fa-shopping-cart::before { + content: "\f07a"; } + +.fa-vials::before { + content: "\f493"; } + +.fa-plug-circle-plus::before { + content: "\e55f"; } + +.fa-place-of-worship::before { + content: "\f67f"; } + +.fa-grip-vertical::before { + content: "\f58e"; } + +.fa-arrow-turn-up::before { + content: "\f148"; } + +.fa-level-up::before { + content: "\f148"; } + +.fa-u::before { + content: "\55"; } + +.fa-square-root-variable::before { + content: "\f698"; } + +.fa-square-root-alt::before { + content: "\f698"; } + +.fa-clock::before { + content: "\f017"; } + +.fa-clock-four::before { + content: "\f017"; } + +.fa-backward-step::before { + content: "\f048"; } + +.fa-step-backward::before { + content: "\f048"; } + +.fa-pallet::before { + content: "\f482"; } + +.fa-faucet::before { + content: "\e005"; } + +.fa-baseball-bat-ball::before { + content: "\f432"; } + +.fa-s::before { + content: "\53"; } + +.fa-timeline::before { + content: "\e29c"; } + +.fa-keyboard::before { + content: "\f11c"; } + +.fa-caret-down::before { + content: "\f0d7"; } + +.fa-house-chimney-medical::before { + content: "\f7f2"; } + +.fa-clinic-medical::before { + content: "\f7f2"; } + +.fa-temperature-three-quarters::before { + content: "\f2c8"; } + +.fa-temperature-3::before { + content: "\f2c8"; } + +.fa-thermometer-3::before { + content: "\f2c8"; } + +.fa-thermometer-three-quarters::before { + content: "\f2c8"; } + +.fa-mobile-screen::before { + content: "\f3cf"; } + +.fa-mobile-android-alt::before { + content: "\f3cf"; } + +.fa-plane-up::before { + content: "\e22d"; } + +.fa-piggy-bank::before { + content: "\f4d3"; } + +.fa-battery-half::before { + content: "\f242"; } + +.fa-battery-3::before { + content: "\f242"; } + +.fa-mountain-city::before { + content: "\e52e"; } + +.fa-coins::before { + content: "\f51e"; } + +.fa-khanda::before { + content: "\f66d"; } + +.fa-sliders::before { + content: "\f1de"; } + +.fa-sliders-h::before { + content: "\f1de"; } + +.fa-folder-tree::before { + content: "\f802"; } + +.fa-network-wired::before { + content: "\f6ff"; } + +.fa-map-pin::before { + content: "\f276"; } + +.fa-hamsa::before { + content: "\f665"; } + +.fa-cent-sign::before { + content: "\e3f5"; } + +.fa-flask::before { + content: "\f0c3"; } + +.fa-person-pregnant::before { + content: "\e31e"; } + +.fa-wand-sparkles::before { + content: "\f72b"; } + +.fa-ellipsis-vertical::before { + content: "\f142"; } + +.fa-ellipsis-v::before { + content: "\f142"; } + +.fa-ticket::before { + content: "\f145"; } + +.fa-power-off::before { + content: "\f011"; } + +.fa-right-long::before { + content: "\f30b"; } + +.fa-long-arrow-alt-right::before { + content: "\f30b"; } + +.fa-flag-usa::before { + content: "\f74d"; } + +.fa-laptop-file::before { + content: "\e51d"; } + +.fa-tty::before { + content: "\f1e4"; } + +.fa-teletype::before { + content: "\f1e4"; } + +.fa-diagram-next::before { + content: "\e476"; } + +.fa-person-rifle::before { + content: "\e54e"; } + +.fa-house-medical-circle-exclamation::before { + content: "\e512"; } + +.fa-closed-captioning::before { + content: "\f20a"; } + +.fa-person-hiking::before { + content: "\f6ec"; } + +.fa-hiking::before { + content: "\f6ec"; } + +.fa-venus-double::before { + content: "\f226"; } + +.fa-images::before { + content: "\f302"; } + +.fa-calculator::before { + content: "\f1ec"; } + +.fa-people-pulling::before { + content: "\e535"; } + +.fa-n::before { + content: "\4e"; } + +.fa-cable-car::before { + content: "\f7da"; } + +.fa-tram::before { + content: "\f7da"; } + +.fa-cloud-rain::before { + content: "\f73d"; } + +.fa-building-circle-xmark::before { + content: "\e4d4"; } + +.fa-ship::before { + content: "\f21a"; } + +.fa-arrows-down-to-line::before { + content: "\e4b8"; } + +.fa-download::before { + content: "\f019"; } + +.fa-face-grin::before { + content: "\f580"; } + +.fa-grin::before { + content: "\f580"; } + +.fa-delete-left::before { + content: "\f55a"; } + +.fa-backspace::before { + content: "\f55a"; } + +.fa-eye-dropper::before { + content: "\f1fb"; } + +.fa-eye-dropper-empty::before { + content: "\f1fb"; } + +.fa-eyedropper::before { + content: "\f1fb"; } + +.fa-file-circle-check::before { + content: "\e5a0"; } + +.fa-forward::before { + content: "\f04e"; } + +.fa-mobile::before { + content: "\f3ce"; } + +.fa-mobile-android::before { + content: "\f3ce"; } + +.fa-mobile-phone::before { + content: "\f3ce"; } + +.fa-face-meh::before { + content: "\f11a"; } + +.fa-meh::before { + content: "\f11a"; } + +.fa-align-center::before { + content: "\f037"; } + +.fa-book-skull::before { + content: "\f6b7"; } + +.fa-book-dead::before { + content: "\f6b7"; } + +.fa-id-card::before { + content: "\f2c2"; } + +.fa-drivers-license::before { + content: "\f2c2"; } + +.fa-outdent::before { + content: "\f03b"; } + +.fa-dedent::before { + content: "\f03b"; } + +.fa-heart-circle-exclamation::before { + content: "\e4fe"; } + +.fa-house::before { + content: "\f015"; } + +.fa-home::before { + content: "\f015"; } + +.fa-home-alt::before { + content: "\f015"; } + +.fa-home-lg-alt::before { + content: "\f015"; } + +.fa-calendar-week::before { + content: "\f784"; } + +.fa-laptop-medical::before { + content: "\f812"; } + +.fa-b::before { + content: "\42"; } + +.fa-file-medical::before { + content: "\f477"; } + +.fa-dice-one::before { + content: "\f525"; } + +.fa-kiwi-bird::before { + content: "\f535"; } + +.fa-arrow-right-arrow-left::before { + content: "\f0ec"; } + +.fa-exchange::before { + content: "\f0ec"; } + +.fa-rotate-right::before { + content: "\f2f9"; } + +.fa-redo-alt::before { + content: "\f2f9"; } + +.fa-rotate-forward::before { + content: "\f2f9"; } + +.fa-utensils::before { + content: "\f2e7"; } + +.fa-cutlery::before { + content: "\f2e7"; } + +.fa-arrow-up-wide-short::before { + content: "\f161"; } + +.fa-sort-amount-up::before { + content: "\f161"; } + +.fa-mill-sign::before { + content: "\e1ed"; } + +.fa-bowl-rice::before { + content: "\e2eb"; } + +.fa-skull::before { + content: "\f54c"; } + +.fa-tower-broadcast::before { + content: "\f519"; } + +.fa-broadcast-tower::before { + content: "\f519"; } + +.fa-truck-pickup::before { + content: "\f63c"; } + +.fa-up-long::before { + content: "\f30c"; } + +.fa-long-arrow-alt-up::before { + content: "\f30c"; } + +.fa-stop::before { + content: "\f04d"; } + +.fa-code-merge::before { + content: "\f387"; } + +.fa-upload::before { + content: "\f093"; } + +.fa-hurricane::before { + content: "\f751"; } + +.fa-mound::before { + content: "\e52d"; } + +.fa-toilet-portable::before { + content: "\e583"; } + +.fa-compact-disc::before { + content: "\f51f"; } + +.fa-file-arrow-down::before { + content: "\f56d"; } + +.fa-file-download::before { + content: "\f56d"; } + +.fa-caravan::before { + content: "\f8ff"; } + +.fa-shield-cat::before { + content: "\e572"; } + +.fa-bolt::before { + content: "\f0e7"; } + +.fa-zap::before { + content: "\f0e7"; } + +.fa-glass-water::before { + content: "\e4f4"; } + +.fa-oil-well::before { + content: "\e532"; } + +.fa-vault::before { + content: "\e2c5"; } + +.fa-mars::before { + content: "\f222"; } + +.fa-toilet::before { + content: "\f7d8"; } + +.fa-plane-circle-xmark::before { + content: "\e557"; } + +.fa-yen-sign::before { + content: "\f157"; } + +.fa-cny::before { + content: "\f157"; } + +.fa-jpy::before { + content: "\f157"; } + +.fa-rmb::before { + content: "\f157"; } + +.fa-yen::before { + content: "\f157"; } + +.fa-ruble-sign::before { + content: "\f158"; } + +.fa-rouble::before { + content: "\f158"; } + +.fa-rub::before { + content: "\f158"; } + +.fa-ruble::before { + content: "\f158"; } + +.fa-sun::before { + content: "\f185"; } + +.fa-guitar::before { + content: "\f7a6"; } + +.fa-face-laugh-wink::before { + content: "\f59c"; } + +.fa-laugh-wink::before { + content: "\f59c"; } + +.fa-horse-head::before { + content: "\f7ab"; } + +.fa-bore-hole::before { + content: "\e4c3"; } + +.fa-industry::before { + content: "\f275"; } + +.fa-circle-down::before { + content: "\f358"; } + +.fa-arrow-alt-circle-down::before { + content: "\f358"; } + +.fa-arrows-turn-to-dots::before { + content: "\e4c1"; } + +.fa-florin-sign::before { + content: "\e184"; } + +.fa-arrow-down-short-wide::before { + content: "\f884"; } + +.fa-sort-amount-desc::before { + content: "\f884"; } + +.fa-sort-amount-down-alt::before { + content: "\f884"; } + +.fa-less-than::before { + content: "\3c"; } + +.fa-angle-down::before { + content: "\f107"; } + +.fa-car-tunnel::before { + content: "\e4de"; } + +.fa-head-side-cough::before { + content: "\e061"; } + +.fa-grip-lines::before { + content: "\f7a4"; } + +.fa-thumbs-down::before { + content: "\f165"; } + +.fa-user-lock::before { + content: "\f502"; } + +.fa-arrow-right-long::before { + content: "\f178"; } + +.fa-long-arrow-right::before { + content: "\f178"; } + +.fa-anchor-circle-xmark::before { + content: "\e4ac"; } + +.fa-ellipsis::before { + content: "\f141"; } + +.fa-ellipsis-h::before { + content: "\f141"; } + +.fa-chess-pawn::before { + content: "\f443"; } + +.fa-kit-medical::before { + content: "\f479"; } + +.fa-first-aid::before { + content: "\f479"; } + +.fa-person-through-window::before { + content: "\e5a9"; } + +.fa-toolbox::before { + content: "\f552"; } + +.fa-hands-holding-circle::before { + content: "\e4fb"; } + +.fa-bug::before { + content: "\f188"; } + +.fa-credit-card::before { + content: "\f09d"; } + +.fa-credit-card-alt::before { + content: "\f09d"; } + +.fa-car::before { + content: "\f1b9"; } + +.fa-automobile::before { + content: "\f1b9"; } + +.fa-hand-holding-hand::before { + content: "\e4f7"; } + +.fa-book-open-reader::before { + content: "\f5da"; } + +.fa-book-reader::before { + content: "\f5da"; } + +.fa-mountain-sun::before { + content: "\e52f"; } + +.fa-arrows-left-right-to-line::before { + content: "\e4ba"; } + +.fa-dice-d20::before { + content: "\f6cf"; } + +.fa-truck-droplet::before { + content: "\e58c"; } + +.fa-file-circle-xmark::before { + content: "\e5a1"; } + +.fa-temperature-arrow-up::before { + content: "\e040"; } + +.fa-temperature-up::before { + content: "\e040"; } + +.fa-medal::before { + content: "\f5a2"; } + +.fa-bed::before { + content: "\f236"; } + +.fa-square-h::before { + content: "\f0fd"; } + +.fa-h-square::before { + content: "\f0fd"; } + +.fa-podcast::before { + content: "\f2ce"; } + +.fa-temperature-full::before { + content: "\f2c7"; } + +.fa-temperature-4::before { + content: "\f2c7"; } + +.fa-thermometer-4::before { + content: "\f2c7"; } + +.fa-thermometer-full::before { + content: "\f2c7"; } + +.fa-bell::before { + content: "\f0f3"; } + +.fa-superscript::before { + content: "\f12b"; } + +.fa-plug-circle-xmark::before { + content: "\e560"; } + +.fa-star-of-life::before { + content: "\f621"; } + +.fa-phone-slash::before { + content: "\f3dd"; } + +.fa-paint-roller::before { + content: "\f5aa"; } + +.fa-handshake-angle::before { + content: "\f4c4"; } + +.fa-hands-helping::before { + content: "\f4c4"; } + +.fa-location-dot::before { + content: "\f3c5"; } + +.fa-map-marker-alt::before { + content: "\f3c5"; } + +.fa-file::before { + content: "\f15b"; } + +.fa-greater-than::before { + content: "\3e"; } + +.fa-person-swimming::before { + content: "\f5c4"; } + +.fa-swimmer::before { + content: "\f5c4"; } + +.fa-arrow-down::before { + content: "\f063"; } + +.fa-droplet::before { + content: "\f043"; } + +.fa-tint::before { + content: "\f043"; } + +.fa-eraser::before { + content: "\f12d"; } + +.fa-earth-americas::before { + content: "\f57d"; } + +.fa-earth::before { + content: "\f57d"; } + +.fa-earth-america::before { + content: "\f57d"; } + +.fa-globe-americas::before { + content: "\f57d"; } + +.fa-person-burst::before { + content: "\e53b"; } + +.fa-dove::before { + content: "\f4ba"; } + +.fa-battery-empty::before { + content: "\f244"; } + +.fa-battery-0::before { + content: "\f244"; } + +.fa-socks::before { + content: "\f696"; } + +.fa-inbox::before { + content: "\f01c"; } + +.fa-section::before { + content: "\e447"; } + +.fa-gauge-high::before { + content: "\f625"; } + +.fa-tachometer-alt::before { + content: "\f625"; } + +.fa-tachometer-alt-fast::before { + content: "\f625"; } + +.fa-envelope-open-text::before { + content: "\f658"; } + +.fa-hospital::before { + content: "\f0f8"; } + +.fa-hospital-alt::before { + content: "\f0f8"; } + +.fa-hospital-wide::before { + content: "\f0f8"; } + +.fa-wine-bottle::before { + content: "\f72f"; } + +.fa-chess-rook::before { + content: "\f447"; } + +.fa-bars-staggered::before { + content: "\f550"; } + +.fa-reorder::before { + content: "\f550"; } + +.fa-stream::before { + content: "\f550"; } + +.fa-dharmachakra::before { + content: "\f655"; } + +.fa-hotdog::before { + content: "\f80f"; } + +.fa-person-walking-with-cane::before { + content: "\f29d"; } + +.fa-blind::before { + content: "\f29d"; } + +.fa-drum::before { + content: "\f569"; } + +.fa-ice-cream::before { + content: "\f810"; } + +.fa-heart-circle-bolt::before { + content: "\e4fc"; } + +.fa-fax::before { + content: "\f1ac"; } + +.fa-paragraph::before { + content: "\f1dd"; } + +.fa-check-to-slot::before { + content: "\f772"; } + +.fa-vote-yea::before { + content: "\f772"; } + +.fa-star-half::before { + content: "\f089"; } + +.fa-boxes-stacked::before { + content: "\f468"; } + +.fa-boxes::before { + content: "\f468"; } + +.fa-boxes-alt::before { + content: "\f468"; } + +.fa-link::before { + content: "\f0c1"; } + +.fa-chain::before { + content: "\f0c1"; } + +.fa-ear-listen::before { + content: "\f2a2"; } + +.fa-assistive-listening-systems::before { + content: "\f2a2"; } + +.fa-tree-city::before { + content: "\e587"; } + +.fa-play::before { + content: "\f04b"; } + +.fa-font::before { + content: "\f031"; } + +.fa-table-cells-row-lock::before { + content: "\e67a"; } + +.fa-rupiah-sign::before { + content: "\e23d"; } + +.fa-magnifying-glass::before { + content: "\f002"; } + +.fa-search::before { + content: "\f002"; } + +.fa-table-tennis-paddle-ball::before { + content: "\f45d"; } + +.fa-ping-pong-paddle-ball::before { + content: "\f45d"; } + +.fa-table-tennis::before { + content: "\f45d"; } + +.fa-person-dots-from-line::before { + content: "\f470"; } + +.fa-diagnoses::before { + content: "\f470"; } + +.fa-trash-can-arrow-up::before { + content: "\f82a"; } + +.fa-trash-restore-alt::before { + content: "\f82a"; } + +.fa-naira-sign::before { + content: "\e1f6"; } + +.fa-cart-arrow-down::before { + content: "\f218"; } + +.fa-walkie-talkie::before { + content: "\f8ef"; } + +.fa-file-pen::before { + content: "\f31c"; } + +.fa-file-edit::before { + content: "\f31c"; } + +.fa-receipt::before { + content: "\f543"; } + +.fa-square-pen::before { + content: "\f14b"; } + +.fa-pen-square::before { + content: "\f14b"; } + +.fa-pencil-square::before { + content: "\f14b"; } + +.fa-suitcase-rolling::before { + content: "\f5c1"; } + +.fa-person-circle-exclamation::before { + content: "\e53f"; } + +.fa-chevron-down::before { + content: "\f078"; } + +.fa-battery-full::before { + content: "\f240"; } + +.fa-battery::before { + content: "\f240"; } + +.fa-battery-5::before { + content: "\f240"; } + +.fa-skull-crossbones::before { + content: "\f714"; } + +.fa-code-compare::before { + content: "\e13a"; } + +.fa-list-ul::before { + content: "\f0ca"; } + +.fa-list-dots::before { + content: "\f0ca"; } + +.fa-school-lock::before { + content: "\e56f"; } + +.fa-tower-cell::before { + content: "\e585"; } + +.fa-down-long::before { + content: "\f309"; } + +.fa-long-arrow-alt-down::before { + content: "\f309"; } + +.fa-ranking-star::before { + content: "\e561"; } + +.fa-chess-king::before { + content: "\f43f"; } + +.fa-person-harassing::before { + content: "\e549"; } + +.fa-brazilian-real-sign::before { + content: "\e46c"; } + +.fa-landmark-dome::before { + content: "\f752"; } + +.fa-landmark-alt::before { + content: "\f752"; } + +.fa-arrow-up::before { + content: "\f062"; } + +.fa-tv::before { + content: "\f26c"; } + +.fa-television::before { + content: "\f26c"; } + +.fa-tv-alt::before { + content: "\f26c"; } + +.fa-shrimp::before { + content: "\e448"; } + +.fa-list-check::before { + content: "\f0ae"; } + +.fa-tasks::before { + content: "\f0ae"; } + +.fa-jug-detergent::before { + content: "\e519"; } + +.fa-circle-user::before { + content: "\f2bd"; } + +.fa-user-circle::before { + content: "\f2bd"; } + +.fa-user-shield::before { + content: "\f505"; } + +.fa-wind::before { + content: "\f72e"; } + +.fa-car-burst::before { + content: "\f5e1"; } + +.fa-car-crash::before { + content: "\f5e1"; } + +.fa-y::before { + content: "\59"; } + +.fa-person-snowboarding::before { + content: "\f7ce"; } + +.fa-snowboarding::before { + content: "\f7ce"; } + +.fa-truck-fast::before { + content: "\f48b"; } + +.fa-shipping-fast::before { + content: "\f48b"; } + +.fa-fish::before { + content: "\f578"; } + +.fa-user-graduate::before { + content: "\f501"; } + +.fa-circle-half-stroke::before { + content: "\f042"; } + +.fa-adjust::before { + content: "\f042"; } + +.fa-clapperboard::before { + content: "\e131"; } + +.fa-circle-radiation::before { + content: "\f7ba"; } + +.fa-radiation-alt::before { + content: "\f7ba"; } + +.fa-baseball::before { + content: "\f433"; } + +.fa-baseball-ball::before { + content: "\f433"; } + +.fa-jet-fighter-up::before { + content: "\e518"; } + +.fa-diagram-project::before { + content: "\f542"; } + +.fa-project-diagram::before { + content: "\f542"; } + +.fa-copy::before { + content: "\f0c5"; } + +.fa-volume-xmark::before { + content: "\f6a9"; } + +.fa-volume-mute::before { + content: "\f6a9"; } + +.fa-volume-times::before { + content: "\f6a9"; } + +.fa-hand-sparkles::before { + content: "\e05d"; } + +.fa-grip::before { + content: "\f58d"; } + +.fa-grip-horizontal::before { + content: "\f58d"; } + +.fa-share-from-square::before { + content: "\f14d"; } + +.fa-share-square::before { + content: "\f14d"; } + +.fa-child-combatant::before { + content: "\e4e0"; } + +.fa-child-rifle::before { + content: "\e4e0"; } + +.fa-gun::before { + content: "\e19b"; } + +.fa-square-phone::before { + content: "\f098"; } + +.fa-phone-square::before { + content: "\f098"; } + +.fa-plus::before { + content: "\2b"; } + +.fa-add::before { + content: "\2b"; } + +.fa-expand::before { + content: "\f065"; } + +.fa-computer::before { + content: "\e4e5"; } + +.fa-xmark::before { + content: "\f00d"; } + +.fa-close::before { + content: "\f00d"; } + +.fa-multiply::before { + content: "\f00d"; } + +.fa-remove::before { + content: "\f00d"; } + +.fa-times::before { + content: "\f00d"; } + +.fa-arrows-up-down-left-right::before { + content: "\f047"; } + +.fa-arrows::before { + content: "\f047"; } + +.fa-chalkboard-user::before { + content: "\f51c"; } + +.fa-chalkboard-teacher::before { + content: "\f51c"; } + +.fa-peso-sign::before { + content: "\e222"; } + +.fa-building-shield::before { + content: "\e4d8"; } + +.fa-baby::before { + content: "\f77c"; } + +.fa-users-line::before { + content: "\e592"; } + +.fa-quote-left::before { + content: "\f10d"; } + +.fa-quote-left-alt::before { + content: "\f10d"; } + +.fa-tractor::before { + content: "\f722"; } + +.fa-trash-arrow-up::before { + content: "\f829"; } + +.fa-trash-restore::before { + content: "\f829"; } + +.fa-arrow-down-up-lock::before { + content: "\e4b0"; } + +.fa-lines-leaning::before { + content: "\e51e"; } + +.fa-ruler-combined::before { + content: "\f546"; } + +.fa-copyright::before { + content: "\f1f9"; } + +.fa-equals::before { + content: "\3d"; } + +.fa-blender::before { + content: "\f517"; } + +.fa-teeth::before { + content: "\f62e"; } + +.fa-shekel-sign::before { + content: "\f20b"; } + +.fa-ils::before { + content: "\f20b"; } + +.fa-shekel::before { + content: "\f20b"; } + +.fa-sheqel::before { + content: "\f20b"; } + +.fa-sheqel-sign::before { + content: "\f20b"; } + +.fa-map::before { + content: "\f279"; } + +.fa-rocket::before { + content: "\f135"; } + +.fa-photo-film::before { + content: "\f87c"; } + +.fa-photo-video::before { + content: "\f87c"; } + +.fa-folder-minus::before { + content: "\f65d"; } + +.fa-store::before { + content: "\f54e"; } + +.fa-arrow-trend-up::before { + content: "\e098"; } + +.fa-plug-circle-minus::before { + content: "\e55e"; } + +.fa-sign-hanging::before { + content: "\f4d9"; } + +.fa-sign::before { + content: "\f4d9"; } + +.fa-bezier-curve::before { + content: "\f55b"; } + +.fa-bell-slash::before { + content: "\f1f6"; } + +.fa-tablet::before { + content: "\f3fb"; } + +.fa-tablet-android::before { + content: "\f3fb"; } + +.fa-school-flag::before { + content: "\e56e"; } + +.fa-fill::before { + content: "\f575"; } + +.fa-angle-up::before { + content: "\f106"; } + +.fa-drumstick-bite::before { + content: "\f6d7"; } + +.fa-holly-berry::before { + content: "\f7aa"; } + +.fa-chevron-left::before { + content: "\f053"; } + +.fa-bacteria::before { + content: "\e059"; } + +.fa-hand-lizard::before { + content: "\f258"; } + +.fa-notdef::before { + content: "\e1fe"; } + +.fa-disease::before { + content: "\f7fa"; } + +.fa-briefcase-medical::before { + content: "\f469"; } + +.fa-genderless::before { + content: "\f22d"; } + +.fa-chevron-right::before { + content: "\f054"; } + +.fa-retweet::before { + content: "\f079"; } + +.fa-car-rear::before { + content: "\f5de"; } + +.fa-car-alt::before { + content: "\f5de"; } + +.fa-pump-soap::before { + content: "\e06b"; } + +.fa-video-slash::before { + content: "\f4e2"; } + +.fa-battery-quarter::before { + content: "\f243"; } + +.fa-battery-2::before { + content: "\f243"; } + +.fa-radio::before { + content: "\f8d7"; } + +.fa-baby-carriage::before { + content: "\f77d"; } + +.fa-carriage-baby::before { + content: "\f77d"; } + +.fa-traffic-light::before { + content: "\f637"; } + +.fa-thermometer::before { + content: "\f491"; } + +.fa-vr-cardboard::before { + content: "\f729"; } + +.fa-hand-middle-finger::before { + content: "\f806"; } + +.fa-percent::before { + content: "\25"; } + +.fa-percentage::before { + content: "\25"; } + +.fa-truck-moving::before { + content: "\f4df"; } + +.fa-glass-water-droplet::before { + content: "\e4f5"; } + +.fa-display::before { + content: "\e163"; } + +.fa-face-smile::before { + content: "\f118"; } + +.fa-smile::before { + content: "\f118"; } + +.fa-thumbtack::before { + content: "\f08d"; } + +.fa-thumb-tack::before { + content: "\f08d"; } + +.fa-trophy::before { + content: "\f091"; } + +.fa-person-praying::before { + content: "\f683"; } + +.fa-pray::before { + content: "\f683"; } + +.fa-hammer::before { + content: "\f6e3"; } + +.fa-hand-peace::before { + content: "\f25b"; } + +.fa-rotate::before { + content: "\f2f1"; } + +.fa-sync-alt::before { + content: "\f2f1"; } + +.fa-spinner::before { + content: "\f110"; } + +.fa-robot::before { + content: "\f544"; } + +.fa-peace::before { + content: "\f67c"; } + +.fa-gears::before { + content: "\f085"; } + +.fa-cogs::before { + content: "\f085"; } + +.fa-warehouse::before { + content: "\f494"; } + +.fa-arrow-up-right-dots::before { + content: "\e4b7"; } + +.fa-splotch::before { + content: "\f5bc"; } + +.fa-face-grin-hearts::before { + content: "\f584"; } + +.fa-grin-hearts::before { + content: "\f584"; } + +.fa-dice-four::before { + content: "\f524"; } + +.fa-sim-card::before { + content: "\f7c4"; } + +.fa-transgender::before { + content: "\f225"; } + +.fa-transgender-alt::before { + content: "\f225"; } + +.fa-mercury::before { + content: "\f223"; } + +.fa-arrow-turn-down::before { + content: "\f149"; } + +.fa-level-down::before { + content: "\f149"; } + +.fa-person-falling-burst::before { + content: "\e547"; } + +.fa-award::before { + content: "\f559"; } + +.fa-ticket-simple::before { + content: "\f3ff"; } + +.fa-ticket-alt::before { + content: "\f3ff"; } + +.fa-building::before { + content: "\f1ad"; } + +.fa-angles-left::before { + content: "\f100"; } + +.fa-angle-double-left::before { + content: "\f100"; } + +.fa-qrcode::before { + content: "\f029"; } + +.fa-clock-rotate-left::before { + content: "\f1da"; } + +.fa-history::before { + content: "\f1da"; } + +.fa-face-grin-beam-sweat::before { + content: "\f583"; } + +.fa-grin-beam-sweat::before { + content: "\f583"; } + +.fa-file-export::before { + content: "\f56e"; } + +.fa-arrow-right-from-file::before { + content: "\f56e"; } + +.fa-shield::before { + content: "\f132"; } + +.fa-shield-blank::before { + content: "\f132"; } + +.fa-arrow-up-short-wide::before { + content: "\f885"; } + +.fa-sort-amount-up-alt::before { + content: "\f885"; } + +.fa-house-medical::before { + content: "\e3b2"; } + +.fa-golf-ball-tee::before { + content: "\f450"; } + +.fa-golf-ball::before { + content: "\f450"; } + +.fa-circle-chevron-left::before { + content: "\f137"; } + +.fa-chevron-circle-left::before { + content: "\f137"; } + +.fa-house-chimney-window::before { + content: "\e00d"; } + +.fa-pen-nib::before { + content: "\f5ad"; } + +.fa-tent-arrow-turn-left::before { + content: "\e580"; } + +.fa-tents::before { + content: "\e582"; } + +.fa-wand-magic::before { + content: "\f0d0"; } + +.fa-magic::before { + content: "\f0d0"; } + +.fa-dog::before { + content: "\f6d3"; } + +.fa-carrot::before { + content: "\f787"; } + +.fa-moon::before { + content: "\f186"; } + +.fa-wine-glass-empty::before { + content: "\f5ce"; } + +.fa-wine-glass-alt::before { + content: "\f5ce"; } + +.fa-cheese::before { + content: "\f7ef"; } + +.fa-yin-yang::before { + content: "\f6ad"; } + +.fa-music::before { + content: "\f001"; } + +.fa-code-commit::before { + content: "\f386"; } + +.fa-temperature-low::before { + content: "\f76b"; } + +.fa-person-biking::before { + content: "\f84a"; } + +.fa-biking::before { + content: "\f84a"; } + +.fa-broom::before { + content: "\f51a"; } + +.fa-shield-heart::before { + content: "\e574"; } + +.fa-gopuram::before { + content: "\f664"; } + +.fa-earth-oceania::before { + content: "\e47b"; } + +.fa-globe-oceania::before { + content: "\e47b"; } + +.fa-square-xmark::before { + content: "\f2d3"; } + +.fa-times-square::before { + content: "\f2d3"; } + +.fa-xmark-square::before { + content: "\f2d3"; } + +.fa-hashtag::before { + content: "\23"; } + +.fa-up-right-and-down-left-from-center::before { + content: "\f424"; } + +.fa-expand-alt::before { + content: "\f424"; } + +.fa-oil-can::before { + content: "\f613"; } + +.fa-t::before { + content: "\54"; } + +.fa-hippo::before { + content: "\f6ed"; } + +.fa-chart-column::before { + content: "\e0e3"; } + +.fa-infinity::before { + content: "\f534"; } + +.fa-vial-circle-check::before { + content: "\e596"; } + +.fa-person-arrow-down-to-line::before { + content: "\e538"; } + +.fa-voicemail::before { + content: "\f897"; } + +.fa-fan::before { + content: "\f863"; } + +.fa-person-walking-luggage::before { + content: "\e554"; } + +.fa-up-down::before { + content: "\f338"; } + +.fa-arrows-alt-v::before { + content: "\f338"; } + +.fa-cloud-moon-rain::before { + content: "\f73c"; } + +.fa-calendar::before { + content: "\f133"; } + +.fa-trailer::before { + content: "\e041"; } + +.fa-bahai::before { + content: "\f666"; } + +.fa-haykal::before { + content: "\f666"; } + +.fa-sd-card::before { + content: "\f7c2"; } + +.fa-dragon::before { + content: "\f6d5"; } + +.fa-shoe-prints::before { + content: "\f54b"; } + +.fa-circle-plus::before { + content: "\f055"; } + +.fa-plus-circle::before { + content: "\f055"; } + +.fa-face-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-hand-holding::before { + content: "\f4bd"; } + +.fa-plug-circle-exclamation::before { + content: "\e55d"; } + +.fa-link-slash::before { + content: "\f127"; } + +.fa-chain-broken::before { + content: "\f127"; } + +.fa-chain-slash::before { + content: "\f127"; } + +.fa-unlink::before { + content: "\f127"; } + +.fa-clone::before { + content: "\f24d"; } + +.fa-person-walking-arrow-loop-left::before { + content: "\e551"; } + +.fa-arrow-up-z-a::before { + content: "\f882"; } + +.fa-sort-alpha-up-alt::before { + content: "\f882"; } + +.fa-fire-flame-curved::before { + content: "\f7e4"; } + +.fa-fire-alt::before { + content: "\f7e4"; } + +.fa-tornado::before { + content: "\f76f"; } + +.fa-file-circle-plus::before { + content: "\e494"; } + +.fa-book-quran::before { + content: "\f687"; } + +.fa-quran::before { + content: "\f687"; } + +.fa-anchor::before { + content: "\f13d"; } + +.fa-border-all::before { + content: "\f84c"; } + +.fa-face-angry::before { + content: "\f556"; } + +.fa-angry::before { + content: "\f556"; } + +.fa-cookie-bite::before { + content: "\f564"; } + +.fa-arrow-trend-down::before { + content: "\e097"; } + +.fa-rss::before { + content: "\f09e"; } + +.fa-feed::before { + content: "\f09e"; } + +.fa-draw-polygon::before { + content: "\f5ee"; } + +.fa-scale-balanced::before { + content: "\f24e"; } + +.fa-balance-scale::before { + content: "\f24e"; } + +.fa-gauge-simple-high::before { + content: "\f62a"; } + +.fa-tachometer::before { + content: "\f62a"; } + +.fa-tachometer-fast::before { + content: "\f62a"; } + +.fa-shower::before { + content: "\f2cc"; } + +.fa-desktop::before { + content: "\f390"; } + +.fa-desktop-alt::before { + content: "\f390"; } + +.fa-m::before { + content: "\4d"; } + +.fa-table-list::before { + content: "\f00b"; } + +.fa-th-list::before { + content: "\f00b"; } + +.fa-comment-sms::before { + content: "\f7cd"; } + +.fa-sms::before { + content: "\f7cd"; } + +.fa-book::before { + content: "\f02d"; } + +.fa-user-plus::before { + content: "\f234"; } + +.fa-check::before { + content: "\f00c"; } + +.fa-battery-three-quarters::before { + content: "\f241"; } + +.fa-battery-4::before { + content: "\f241"; } + +.fa-house-circle-check::before { + content: "\e509"; } + +.fa-angle-left::before { + content: "\f104"; } + +.fa-diagram-successor::before { + content: "\e47a"; } + +.fa-truck-arrow-right::before { + content: "\e58b"; } + +.fa-arrows-split-up-and-left::before { + content: "\e4bc"; } + +.fa-hand-fist::before { + content: "\f6de"; } + +.fa-fist-raised::before { + content: "\f6de"; } + +.fa-cloud-moon::before { + content: "\f6c3"; } + +.fa-briefcase::before { + content: "\f0b1"; } + +.fa-person-falling::before { + content: "\e546"; } + +.fa-image-portrait::before { + content: "\f3e0"; } + +.fa-portrait::before { + content: "\f3e0"; } + +.fa-user-tag::before { + content: "\f507"; } + +.fa-rug::before { + content: "\e569"; } + +.fa-earth-europe::before { + content: "\f7a2"; } + +.fa-globe-europe::before { + content: "\f7a2"; } + +.fa-cart-flatbed-suitcase::before { + content: "\f59d"; } + +.fa-luggage-cart::before { + content: "\f59d"; } + +.fa-rectangle-xmark::before { + content: "\f410"; } + +.fa-rectangle-times::before { + content: "\f410"; } + +.fa-times-rectangle::before { + content: "\f410"; } + +.fa-window-close::before { + content: "\f410"; } + +.fa-baht-sign::before { + content: "\e0ac"; } + +.fa-book-open::before { + content: "\f518"; } + +.fa-book-journal-whills::before { + content: "\f66a"; } + +.fa-journal-whills::before { + content: "\f66a"; } + +.fa-handcuffs::before { + content: "\e4f8"; } + +.fa-triangle-exclamation::before { + content: "\f071"; } + +.fa-exclamation-triangle::before { + content: "\f071"; } + +.fa-warning::before { + content: "\f071"; } + +.fa-database::before { + content: "\f1c0"; } + +.fa-share::before { + content: "\f064"; } + +.fa-mail-forward::before { + content: "\f064"; } + +.fa-bottle-droplet::before { + content: "\e4c4"; } + +.fa-mask-face::before { + content: "\e1d7"; } + +.fa-hill-rockslide::before { + content: "\e508"; } + +.fa-right-left::before { + content: "\f362"; } + +.fa-exchange-alt::before { + content: "\f362"; } + +.fa-paper-plane::before { + content: "\f1d8"; } + +.fa-road-circle-exclamation::before { + content: "\e565"; } + +.fa-dungeon::before { + content: "\f6d9"; } + +.fa-align-right::before { + content: "\f038"; } + +.fa-money-bill-1-wave::before { + content: "\f53b"; } + +.fa-money-bill-wave-alt::before { + content: "\f53b"; } + +.fa-life-ring::before { + content: "\f1cd"; } + +.fa-hands::before { + content: "\f2a7"; } + +.fa-sign-language::before { + content: "\f2a7"; } + +.fa-signing::before { + content: "\f2a7"; } + +.fa-calendar-day::before { + content: "\f783"; } + +.fa-water-ladder::before { + content: "\f5c5"; } + +.fa-ladder-water::before { + content: "\f5c5"; } + +.fa-swimming-pool::before { + content: "\f5c5"; } + +.fa-arrows-up-down::before { + content: "\f07d"; } + +.fa-arrows-v::before { + content: "\f07d"; } + +.fa-face-grimace::before { + content: "\f57f"; } + +.fa-grimace::before { + content: "\f57f"; } + +.fa-wheelchair-move::before { + content: "\e2ce"; } + +.fa-wheelchair-alt::before { + content: "\e2ce"; } + +.fa-turn-down::before { + content: "\f3be"; } + +.fa-level-down-alt::before { + content: "\f3be"; } + +.fa-person-walking-arrow-right::before { + content: "\e552"; } + +.fa-square-envelope::before { + content: "\f199"; } + +.fa-envelope-square::before { + content: "\f199"; } + +.fa-dice::before { + content: "\f522"; } + +.fa-bowling-ball::before { + content: "\f436"; } + +.fa-brain::before { + content: "\f5dc"; } + +.fa-bandage::before { + content: "\f462"; } + +.fa-band-aid::before { + content: "\f462"; } + +.fa-calendar-minus::before { + content: "\f272"; } + +.fa-circle-xmark::before { + content: "\f057"; } + +.fa-times-circle::before { + content: "\f057"; } + +.fa-xmark-circle::before { + content: "\f057"; } + +.fa-gifts::before { + content: "\f79c"; } + +.fa-hotel::before { + content: "\f594"; } + +.fa-earth-asia::before { + content: "\f57e"; } + +.fa-globe-asia::before { + content: "\f57e"; } + +.fa-id-card-clip::before { + content: "\f47f"; } + +.fa-id-card-alt::before { + content: "\f47f"; } + +.fa-magnifying-glass-plus::before { + content: "\f00e"; } + +.fa-search-plus::before { + content: "\f00e"; } + +.fa-thumbs-up::before { + content: "\f164"; } + +.fa-user-clock::before { + content: "\f4fd"; } + +.fa-hand-dots::before { + content: "\f461"; } + +.fa-allergies::before { + content: "\f461"; } + +.fa-file-invoice::before { + content: "\f570"; } + +.fa-window-minimize::before { + content: "\f2d1"; } + +.fa-mug-saucer::before { + content: "\f0f4"; } + +.fa-coffee::before { + content: "\f0f4"; } + +.fa-brush::before { + content: "\f55d"; } + +.fa-mask::before { + content: "\f6fa"; } + +.fa-magnifying-glass-minus::before { + content: "\f010"; } + +.fa-search-minus::before { + content: "\f010"; } + +.fa-ruler-vertical::before { + content: "\f548"; } + +.fa-user-large::before { + content: "\f406"; } + +.fa-user-alt::before { + content: "\f406"; } + +.fa-train-tram::before { + content: "\e5b4"; } + +.fa-user-nurse::before { + content: "\f82f"; } + +.fa-syringe::before { + content: "\f48e"; } + +.fa-cloud-sun::before { + content: "\f6c4"; } + +.fa-stopwatch-20::before { + content: "\e06f"; } + +.fa-square-full::before { + content: "\f45c"; } + +.fa-magnet::before { + content: "\f076"; } + +.fa-jar::before { + content: "\e516"; } + +.fa-note-sticky::before { + content: "\f249"; } + +.fa-sticky-note::before { + content: "\f249"; } + +.fa-bug-slash::before { + content: "\e490"; } + +.fa-arrow-up-from-water-pump::before { + content: "\e4b6"; } + +.fa-bone::before { + content: "\f5d7"; } + +.fa-user-injured::before { + content: "\f728"; } + +.fa-face-sad-tear::before { + content: "\f5b4"; } + +.fa-sad-tear::before { + content: "\f5b4"; } + +.fa-plane::before { + content: "\f072"; } + +.fa-tent-arrows-down::before { + content: "\e581"; } + +.fa-exclamation::before { + content: "\21"; } + +.fa-arrows-spin::before { + content: "\e4bb"; } + +.fa-print::before { + content: "\f02f"; } + +.fa-turkish-lira-sign::before { + content: "\e2bb"; } + +.fa-try::before { + content: "\e2bb"; } + +.fa-turkish-lira::before { + content: "\e2bb"; } + +.fa-dollar-sign::before { + content: "\24"; } + +.fa-dollar::before { + content: "\24"; } + +.fa-usd::before { + content: "\24"; } + +.fa-x::before { + content: "\58"; } + +.fa-magnifying-glass-dollar::before { + content: "\f688"; } + +.fa-search-dollar::before { + content: "\f688"; } + +.fa-users-gear::before { + content: "\f509"; } + +.fa-users-cog::before { + content: "\f509"; } + +.fa-person-military-pointing::before { + content: "\e54a"; } + +.fa-building-columns::before { + content: "\f19c"; } + +.fa-bank::before { + content: "\f19c"; } + +.fa-institution::before { + content: "\f19c"; } + +.fa-museum::before { + content: "\f19c"; } + +.fa-university::before { + content: "\f19c"; } + +.fa-umbrella::before { + content: "\f0e9"; } + +.fa-trowel::before { + content: "\e589"; } + +.fa-d::before { + content: "\44"; } + +.fa-stapler::before { + content: "\e5af"; } + +.fa-masks-theater::before { + content: "\f630"; } + +.fa-theater-masks::before { + content: "\f630"; } + +.fa-kip-sign::before { + content: "\e1c4"; } + +.fa-hand-point-left::before { + content: "\f0a5"; } + +.fa-handshake-simple::before { + content: "\f4c6"; } + +.fa-handshake-alt::before { + content: "\f4c6"; } + +.fa-jet-fighter::before { + content: "\f0fb"; } + +.fa-fighter-jet::before { + content: "\f0fb"; } + +.fa-square-share-nodes::before { + content: "\f1e1"; } + +.fa-share-alt-square::before { + content: "\f1e1"; } + +.fa-barcode::before { + content: "\f02a"; } + +.fa-plus-minus::before { + content: "\e43c"; } + +.fa-video::before { + content: "\f03d"; } + +.fa-video-camera::before { + content: "\f03d"; } + +.fa-graduation-cap::before { + content: "\f19d"; } + +.fa-mortar-board::before { + content: "\f19d"; } + +.fa-hand-holding-medical::before { + content: "\e05c"; } + +.fa-person-circle-check::before { + content: "\e53e"; } + +.fa-turn-up::before { + content: "\f3bf"; } + +.fa-level-up-alt::before { + content: "\f3bf"; } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } +:root, :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } + +@font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +.fab, +.fa-brands { + font-weight: 400; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-pixiv:before { + content: "\e640"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-square-js:before { + content: "\f3b9"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-jxl:before { + content: "\e67b"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-square-reddit:before { + content: "\f1a2"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-square-font-awesome:before { + content: "\e5ad"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-brave:before { + content: "\e63c"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-square-instagram:before { + content: "\e055"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-square-hacker-news:before { + content: "\f3af"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-threads:before { + content: "\e618"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-square-snapchat:before { + content: "\f2ad"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-square-font-awesome-stroke:before { + content: "\f35c"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-square-viadeo:before { + content: "\f2aa"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-opensuse:before { + content: "\e62b"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-square-dribbble:before { + content: "\f397"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-node:before { + content: "\f419"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-debian:before { + content: "\e60b"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-square-twitter:before { + content: "\f081"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-golang:before { + content: "\e40f"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-square-kickstarter:before { + content: "\f3bb"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-square-youtube:before { + content: "\f431"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-nfc-directional:before { + content: "\e530"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-meta:before { + content: "\e49b"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-square-letterboxd:before { + content: "\e62e"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-shoelace:before { + content: "\e60c"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-square-steam:before { + content: "\f1b7"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-500px:before { + content: "\f26e"; } + +.fa-square-vimeo:before { + content: "\f194"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-flag:before { + content: "\f2b4"; } + +.fa-font-awesome-logo-full:before { + content: "\f2b4"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-padlet:before { + content: "\e4a0"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-square-github:before { + content: "\f092"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-square-threads:before { + content: "\e619"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-google-scholar:before { + content: "\e63b"; } + +.fa-square-gitlab:before { + content: "\e5ae"; } + +.fa-gitlab-square:before { + content: "\e5ae"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-square-odnoklassniki:before { + content: "\f264"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-hashnode:before { + content: "\e499"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-square-pinterest:before { + content: "\f0d3"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-signal-messenger:before { + content: "\e663"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-nfc-symbol:before { + content: "\e531"; } + +.fa-mintbit:before { + content: "\e62f"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-brave-reverse:before { + content: "\e63d"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-square-google-plus:before { + content: "\f0d4"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-web-awesome:before { + content: "\e682"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-square-xing:before { + content: "\f169"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-letterboxd:before { + content: "\e62d"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-bilibili:before { + content: "\e3d9"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-x-twitter:before { + content: "\e61b"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-42-group:before { + content: "\e080"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-square-pied-piper:before { + content: "\e01e"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-square-web-awesome-stroke:before { + content: "\e684"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-square-facebook:before { + content: "\f082"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-square-lastfm:before { + content: "\f203"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-cmplid:before { + content: "\e360"; } + +.fa-upwork:before { + content: "\e641"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-square-upwork:before { + content: "\e67c"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-screenpal:before { + content: "\e570"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-square-web-awesome:before { + content: "\e683"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-wirsindhandwerk:before { + content: "\e2d0"; } + +.fa-wsh:before { + content: "\e2d0"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-bluesky:before { + content: "\e671"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-square-behance:before { + content: "\f1b5"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-webflow:before { + content: "\e65c"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-space-awesome:before { + content: "\e5ac"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-square-git:before { + content: "\f1d2"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-square-tumblr:before { + content: "\f174"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-bots:before { + content: "\e340"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-php:before { + content: "\f457"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-stubber:before { + content: "\e5c7"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f2c6"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-odysee:before { + content: "\e5c6"; } + +.fa-square-whatsapp:before { + content: "\f40c"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f198"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-square-x-twitter:before { + content: "\e61a"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f23a"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-sitrox:before { + content: "\e44a"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-pix:before { + content: "\e43a"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +.far, +.fa-regular { + font-weight: 400; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +.fas, +.fa-solid { + font-weight: 900; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 900; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); } diff --git a/docs/deps/font-awesome-6.5.2/css/all.min.css b/docs/deps/font-awesome-6.5.2/css/all.min.css new file mode 100644 index 00000000..269bceea --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); } \ No newline at end of file diff --git a/docs/deps/font-awesome-6.5.2/css/v4-shims.css b/docs/deps/font-awesome-6.5.2/css/v4-shims.css new file mode 100644 index 00000000..ea60ea4d --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/v4-shims.css @@ -0,0 +1,2194 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before { + content: "\f000"; } + +.fa.fa-envelope-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-o:before { + content: "\f0e0"; } + +.fa.fa-star-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-o:before { + content: "\f005"; } + +.fa.fa-remove:before { + content: "\f00d"; } + +.fa.fa-close:before { + content: "\f00d"; } + +.fa.fa-gear:before { + content: "\f013"; } + +.fa.fa-trash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-trash-o:before { + content: "\f2ed"; } + +.fa.fa-home:before { + content: "\f015"; } + +.fa.fa-file-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-o:before { + content: "\f15b"; } + +.fa.fa-clock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-clock-o:before { + content: "\f017"; } + +.fa.fa-arrow-circle-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-down:before { + content: "\f358"; } + +.fa.fa-arrow-circle-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-up:before { + content: "\f35b"; } + +.fa.fa-play-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-play-circle-o:before { + content: "\f144"; } + +.fa.fa-repeat:before { + content: "\f01e"; } + +.fa.fa-rotate-right:before { + content: "\f01e"; } + +.fa.fa-refresh:before { + content: "\f021"; } + +.fa.fa-list-alt { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-list-alt:before { + content: "\f022"; } + +.fa.fa-dedent:before { + content: "\f03b"; } + +.fa.fa-video-camera:before { + content: "\f03d"; } + +.fa.fa-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-picture-o:before { + content: "\f03e"; } + +.fa.fa-photo { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-photo:before { + content: "\f03e"; } + +.fa.fa-image { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-image:before { + content: "\f03e"; } + +.fa.fa-map-marker:before { + content: "\f3c5"; } + +.fa.fa-pencil-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pencil-square-o:before { + content: "\f044"; } + +.fa.fa-edit { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-edit:before { + content: "\f044"; } + +.fa.fa-share-square-o:before { + content: "\f14d"; } + +.fa.fa-check-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-square-o:before { + content: "\f14a"; } + +.fa.fa-arrows:before { + content: "\f0b2"; } + +.fa.fa-times-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-circle-o:before { + content: "\f057"; } + +.fa.fa-check-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-circle-o:before { + content: "\f058"; } + +.fa.fa-mail-forward:before { + content: "\f064"; } + +.fa.fa-expand:before { + content: "\f424"; } + +.fa.fa-compress:before { + content: "\f422"; } + +.fa.fa-eye { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eye-slash { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-warning:before { + content: "\f071"; } + +.fa.fa-calendar:before { + content: "\f073"; } + +.fa.fa-arrows-v:before { + content: "\f338"; } + +.fa.fa-arrows-h:before { + content: "\f337"; } + +.fa.fa-bar-chart:before { + content: "\e0e3"; } + +.fa.fa-bar-chart-o:before { + content: "\e0e3"; } + +.fa.fa-twitter-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitter-square:before { + content: "\f081"; } + +.fa.fa-facebook-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-square:before { + content: "\f082"; } + +.fa.fa-gears:before { + content: "\f085"; } + +.fa.fa-thumbs-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-up:before { + content: "\f164"; } + +.fa.fa-thumbs-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-down:before { + content: "\f165"; } + +.fa.fa-heart-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-heart-o:before { + content: "\f004"; } + +.fa.fa-sign-out:before { + content: "\f2f5"; } + +.fa.fa-linkedin-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin-square:before { + content: "\f08c"; } + +.fa.fa-thumb-tack:before { + content: "\f08d"; } + +.fa.fa-external-link:before { + content: "\f35d"; } + +.fa.fa-sign-in:before { + content: "\f2f6"; } + +.fa.fa-github-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-github-square:before { + content: "\f092"; } + +.fa.fa-lemon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lemon-o:before { + content: "\f094"; } + +.fa.fa-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-square-o:before { + content: "\f0c8"; } + +.fa.fa-bookmark-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bookmark-o:before { + content: "\f02e"; } + +.fa.fa-twitter { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook:before { + content: "\f39e"; } + +.fa.fa-facebook-f { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-f:before { + content: "\f39e"; } + +.fa.fa-github { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-feed:before { + content: "\f09e"; } + +.fa.fa-hdd-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hdd-o:before { + content: "\f0a0"; } + +.fa.fa-hand-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-right:before { + content: "\f0a4"; } + +.fa.fa-hand-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-left:before { + content: "\f0a5"; } + +.fa.fa-hand-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-up:before { + content: "\f0a6"; } + +.fa.fa-hand-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-down:before { + content: "\f0a7"; } + +.fa.fa-globe:before { + content: "\f57d"; } + +.fa.fa-tasks:before { + content: "\f828"; } + +.fa.fa-arrows-alt:before { + content: "\f31e"; } + +.fa.fa-group:before { + content: "\f0c0"; } + +.fa.fa-chain:before { + content: "\f0c1"; } + +.fa.fa-cut:before { + content: "\f0c4"; } + +.fa.fa-files-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-files-o:before { + content: "\f0c5"; } + +.fa.fa-floppy-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-floppy-o:before { + content: "\f0c7"; } + +.fa.fa-save { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-save:before { + content: "\f0c7"; } + +.fa.fa-navicon:before { + content: "\f0c9"; } + +.fa.fa-reorder:before { + content: "\f0c9"; } + +.fa.fa-magic:before { + content: "\e2ca"; } + +.fa.fa-pinterest { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa.fa-google-plus-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa.fa-google-plus { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus:before { + content: "\f0d5"; } + +.fa.fa-money:before { + content: "\f3d1"; } + +.fa.fa-unsorted:before { + content: "\f0dc"; } + +.fa.fa-sort-desc:before { + content: "\f0dd"; } + +.fa.fa-sort-asc:before { + content: "\f0de"; } + +.fa.fa-linkedin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin:before { + content: "\f0e1"; } + +.fa.fa-rotate-left:before { + content: "\f0e2"; } + +.fa.fa-legal:before { + content: "\f0e3"; } + +.fa.fa-tachometer:before { + content: "\f625"; } + +.fa.fa-dashboard:before { + content: "\f625"; } + +.fa.fa-comment-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comment-o:before { + content: "\f075"; } + +.fa.fa-comments-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comments-o:before { + content: "\f086"; } + +.fa.fa-flash:before { + content: "\f0e7"; } + +.fa.fa-clipboard:before { + content: "\f0ea"; } + +.fa.fa-lightbulb-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lightbulb-o:before { + content: "\f0eb"; } + +.fa.fa-exchange:before { + content: "\f362"; } + +.fa.fa-cloud-download:before { + content: "\f0ed"; } + +.fa.fa-cloud-upload:before { + content: "\f0ee"; } + +.fa.fa-bell-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-o:before { + content: "\f0f3"; } + +.fa.fa-cutlery:before { + content: "\f2e7"; } + +.fa.fa-file-text-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-text-o:before { + content: "\f15c"; } + +.fa.fa-building-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-building-o:before { + content: "\f1ad"; } + +.fa.fa-hospital-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hospital-o:before { + content: "\f0f8"; } + +.fa.fa-tablet:before { + content: "\f3fa"; } + +.fa.fa-mobile:before { + content: "\f3cd"; } + +.fa.fa-mobile-phone:before { + content: "\f3cd"; } + +.fa.fa-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-o:before { + content: "\f111"; } + +.fa.fa-mail-reply:before { + content: "\f3e5"; } + +.fa.fa-github-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-folder-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-o:before { + content: "\f07b"; } + +.fa.fa-folder-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-open-o:before { + content: "\f07c"; } + +.fa.fa-smile-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-smile-o:before { + content: "\f118"; } + +.fa.fa-frown-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-frown-o:before { + content: "\f119"; } + +.fa.fa-meh-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-meh-o:before { + content: "\f11a"; } + +.fa.fa-keyboard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-keyboard-o:before { + content: "\f11c"; } + +.fa.fa-flag-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-flag-o:before { + content: "\f024"; } + +.fa.fa-mail-reply-all:before { + content: "\f122"; } + +.fa.fa-star-half-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-o:before { + content: "\f5c0"; } + +.fa.fa-star-half-empty { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-empty:before { + content: "\f5c0"; } + +.fa.fa-star-half-full { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-full:before { + content: "\f5c0"; } + +.fa.fa-code-fork:before { + content: "\f126"; } + +.fa.fa-chain-broken:before { + content: "\f127"; } + +.fa.fa-unlink:before { + content: "\f127"; } + +.fa.fa-calendar-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-o:before { + content: "\f133"; } + +.fa.fa-maxcdn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-html5 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-css3 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-unlock-alt:before { + content: "\f09c"; } + +.fa.fa-minus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-minus-square-o:before { + content: "\f146"; } + +.fa.fa-level-up:before { + content: "\f3bf"; } + +.fa.fa-level-down:before { + content: "\f3be"; } + +.fa.fa-pencil-square:before { + content: "\f14b"; } + +.fa.fa-external-link-square:before { + content: "\f360"; } + +.fa.fa-compass { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down:before { + content: "\f150"; } + +.fa.fa-toggle-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-down:before { + content: "\f150"; } + +.fa.fa-caret-square-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-up:before { + content: "\f151"; } + +.fa.fa-toggle-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-up:before { + content: "\f151"; } + +.fa.fa-caret-square-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-right:before { + content: "\f152"; } + +.fa.fa-toggle-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-right:before { + content: "\f152"; } + +.fa.fa-eur:before { + content: "\f153"; } + +.fa.fa-euro:before { + content: "\f153"; } + +.fa.fa-gbp:before { + content: "\f154"; } + +.fa.fa-usd:before { + content: "\24"; } + +.fa.fa-dollar:before { + content: "\24"; } + +.fa.fa-inr:before { + content: "\e1bc"; } + +.fa.fa-rupee:before { + content: "\e1bc"; } + +.fa.fa-jpy:before { + content: "\f157"; } + +.fa.fa-cny:before { + content: "\f157"; } + +.fa.fa-rmb:before { + content: "\f157"; } + +.fa.fa-yen:before { + content: "\f157"; } + +.fa.fa-rub:before { + content: "\f158"; } + +.fa.fa-ruble:before { + content: "\f158"; } + +.fa.fa-rouble:before { + content: "\f158"; } + +.fa.fa-krw:before { + content: "\f159"; } + +.fa.fa-won:before { + content: "\f159"; } + +.fa.fa-btc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin:before { + content: "\f15a"; } + +.fa.fa-file-text:before { + content: "\f15c"; } + +.fa.fa-sort-alpha-asc:before { + content: "\f15d"; } + +.fa.fa-sort-alpha-desc:before { + content: "\f881"; } + +.fa.fa-sort-amount-asc:before { + content: "\f884"; } + +.fa.fa-sort-amount-desc:before { + content: "\f160"; } + +.fa.fa-sort-numeric-asc:before { + content: "\f162"; } + +.fa.fa-sort-numeric-desc:before { + content: "\f886"; } + +.fa.fa-youtube-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-square:before { + content: "\f431"; } + +.fa.fa-youtube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square:before { + content: "\f169"; } + +.fa.fa-youtube-play { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play:before { + content: "\f167"; } + +.fa.fa-dropbox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-overflow { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-instagram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-flickr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-adn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square:before { + content: "\f171"; } + +.fa.fa-tumblr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square:before { + content: "\f174"; } + +.fa.fa-long-arrow-down:before { + content: "\f309"; } + +.fa.fa-long-arrow-up:before { + content: "\f30c"; } + +.fa.fa-long-arrow-left:before { + content: "\f30a"; } + +.fa.fa-long-arrow-right:before { + content: "\f30b"; } + +.fa.fa-apple { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-windows { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-android { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linux { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dribbble { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skype { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-foursquare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-trello { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gratipay { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip:before { + content: "\f184"; } + +.fa.fa-sun-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sun-o:before { + content: "\f185"; } + +.fa.fa-moon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-moon-o:before { + content: "\f186"; } + +.fa.fa-vk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-renren { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pagelines { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-exchange { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right:before { + content: "\f35a"; } + +.fa.fa-arrow-circle-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-left:before { + content: "\f359"; } + +.fa.fa-caret-square-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-left:before { + content: "\f191"; } + +.fa.fa-toggle-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-left:before { + content: "\f191"; } + +.fa.fa-dot-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-dot-circle-o:before { + content: "\f192"; } + +.fa.fa-vimeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo-square:before { + content: "\f194"; } + +.fa.fa-try:before { + content: "\e2bb"; } + +.fa.fa-turkish-lira:before { + content: "\e2bb"; } + +.fa.fa-plus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-plus-square-o:before { + content: "\f0fe"; } + +.fa.fa-slack { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wordpress { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-openid { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-institution:before { + content: "\f19c"; } + +.fa.fa-bank:before { + content: "\f19c"; } + +.fa.fa-mortar-board:before { + content: "\f19d"; } + +.fa.fa-yahoo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square:before { + content: "\f1a2"; } + +.fa.fa-stumbleupon-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-delicious { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-digg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-pp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-drupal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-joomla { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square:before { + content: "\f1b5"; } + +.fa.fa-steam { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square:before { + content: "\f1b7"; } + +.fa.fa-automobile:before { + content: "\f1b9"; } + +.fa.fa-cab:before { + content: "\f1ba"; } + +.fa.fa-spotify { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-deviantart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-soundcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-file-pdf-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-pdf-o:before { + content: "\f1c1"; } + +.fa.fa-file-word-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-word-o:before { + content: "\f1c2"; } + +.fa.fa-file-excel-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-excel-o:before { + content: "\f1c3"; } + +.fa.fa-file-powerpoint-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-powerpoint-o:before { + content: "\f1c4"; } + +.fa.fa-file-image-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-image-o:before { + content: "\f1c5"; } + +.fa.fa-file-photo-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-photo-o:before { + content: "\f1c5"; } + +.fa.fa-file-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-picture-o:before { + content: "\f1c5"; } + +.fa.fa-file-archive-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-archive-o:before { + content: "\f1c6"; } + +.fa.fa-file-zip-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-zip-o:before { + content: "\f1c6"; } + +.fa.fa-file-audio-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-audio-o:before { + content: "\f1c7"; } + +.fa.fa-file-sound-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-sound-o:before { + content: "\f1c7"; } + +.fa.fa-file-video-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-video-o:before { + content: "\f1c8"; } + +.fa.fa-file-movie-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-movie-o:before { + content: "\f1c8"; } + +.fa.fa-file-code-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-code-o:before { + content: "\f1c9"; } + +.fa.fa-vine { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-codepen { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-jsfiddle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-life-bouy:before { + content: "\f1cd"; } + +.fa.fa-life-buoy:before { + content: "\f1cd"; } + +.fa.fa-life-saver:before { + content: "\f1cd"; } + +.fa.fa-support:before { + content: "\f1cd"; } + +.fa.fa-circle-o-notch:before { + content: "\f1ce"; } + +.fa.fa-rebel { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra:before { + content: "\f1d0"; } + +.fa.fa-resistance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-resistance:before { + content: "\f1d0"; } + +.fa.fa-empire { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge:before { + content: "\f1d1"; } + +.fa.fa-git-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-git-square:before { + content: "\f1d2"; } + +.fa.fa-git { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hacker-news { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square:before { + content: "\f1d4"; } + +.fa.fa-yc-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc-square:before { + content: "\f1d4"; } + +.fa.fa-tencent-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-qq { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weixin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat:before { + content: "\f1d7"; } + +.fa.fa-send:before { + content: "\f1d8"; } + +.fa.fa-paper-plane-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-paper-plane-o:before { + content: "\f1d8"; } + +.fa.fa-send-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-send-o:before { + content: "\f1d8"; } + +.fa.fa-circle-thin { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-thin:before { + content: "\f111"; } + +.fa.fa-header:before { + content: "\f1dc"; } + +.fa.fa-futbol-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-futbol-o:before { + content: "\f1e3"; } + +.fa.fa-soccer-ball-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-soccer-ball-o:before { + content: "\f1e3"; } + +.fa.fa-slideshare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitch { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yelp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-newspaper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-newspaper-o:before { + content: "\f1ea"; } + +.fa.fa-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-wallet { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-visa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-mastercard { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-discover { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-amex { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-stripe { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bell-slash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-slash-o:before { + content: "\f1f6"; } + +.fa.fa-trash:before { + content: "\f2ed"; } + +.fa.fa-copyright { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eyedropper:before { + content: "\f1fb"; } + +.fa.fa-area-chart:before { + content: "\f1fe"; } + +.fa.fa-pie-chart:before { + content: "\f200"; } + +.fa.fa-line-chart:before { + content: "\f201"; } + +.fa.fa-lastfm { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square:before { + content: "\f203"; } + +.fa.fa-ioxhost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-angellist { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-cc:before { + content: "\f20a"; } + +.fa.fa-ils:before { + content: "\f20b"; } + +.fa.fa-shekel:before { + content: "\f20b"; } + +.fa.fa-sheqel:before { + content: "\f20b"; } + +.fa.fa-buysellads { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-connectdevelop { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dashcube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-forumbee { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-leanpub { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-sellsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-shirtsinbulk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-simplybuilt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skyatlas { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-diamond { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-diamond:before { + content: "\f3a5"; } + +.fa.fa-transgender:before { + content: "\f224"; } + +.fa.fa-intersex:before { + content: "\f224"; } + +.fa.fa-transgender-alt:before { + content: "\f225"; } + +.fa.fa-facebook-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-official:before { + content: "\f09a"; } + +.fa.fa-pinterest-p { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-whatsapp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hotel:before { + content: "\f236"; } + +.fa.fa-viacoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-medium { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc:before { + content: "\f23b"; } + +.fa.fa-optin-monster { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opencart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-expeditedssl { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-battery-4:before { + content: "\f240"; } + +.fa.fa-battery:before { + content: "\f240"; } + +.fa.fa-battery-3:before { + content: "\f241"; } + +.fa.fa-battery-2:before { + content: "\f242"; } + +.fa.fa-battery-1:before { + content: "\f243"; } + +.fa.fa-battery-0:before { + content: "\f244"; } + +.fa.fa-object-group { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-object-ungroup { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o:before { + content: "\f249"; } + +.fa.fa-cc-jcb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-diners-club { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-clone { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o:before { + content: "\f254"; } + +.fa.fa-hourglass-1:before { + content: "\f251"; } + +.fa.fa-hourglass-2:before { + content: "\f252"; } + +.fa.fa-hourglass-3:before { + content: "\f253"; } + +.fa.fa-hand-rock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-rock-o:before { + content: "\f255"; } + +.fa.fa-hand-grab-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-grab-o:before { + content: "\f255"; } + +.fa.fa-hand-paper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-paper-o:before { + content: "\f256"; } + +.fa.fa-hand-stop-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-stop-o:before { + content: "\f256"; } + +.fa.fa-hand-scissors-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-scissors-o:before { + content: "\f257"; } + +.fa.fa-hand-lizard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-lizard-o:before { + content: "\f258"; } + +.fa.fa-hand-spock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-spock-o:before { + content: "\f259"; } + +.fa.fa-hand-pointer-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-pointer-o:before { + content: "\f25a"; } + +.fa.fa-hand-peace-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-peace-o:before { + content: "\f25b"; } + +.fa.fa-registered { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-creative-commons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa.fa-get-pocket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wikipedia-w { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-safari { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-chrome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-firefox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opera { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-internet-explorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-television:before { + content: "\f26c"; } + +.fa.fa-contao { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-500px { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-amazon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-calendar-plus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-plus-o:before { + content: "\f271"; } + +.fa.fa-calendar-minus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-minus-o:before { + content: "\f272"; } + +.fa.fa-calendar-times-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-times-o:before { + content: "\f273"; } + +.fa.fa-calendar-check-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-check-o:before { + content: "\f274"; } + +.fa.fa-map-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-map-o:before { + content: "\f279"; } + +.fa.fa-commenting:before { + content: "\f4ad"; } + +.fa.fa-commenting-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-commenting-o:before { + content: "\f4ad"; } + +.fa.fa-houzz { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo:before { + content: "\f27d"; } + +.fa.fa-black-tie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fonticons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-alien { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-edge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card-alt:before { + content: "\f09d"; } + +.fa.fa-codiepie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-modx { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fort-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-usb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-product-hunt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-mixcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-scribd { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pause-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pause-circle-o:before { + content: "\f28b"; } + +.fa.fa-stop-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-stop-circle-o:before { + content: "\f28d"; } + +.fa.fa-bluetooth { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bluetooth-b { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gitlab { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpbeginner { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpforms { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-envira { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt:before { + content: "\f368"; } + +.fa.fa-question-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-question-circle-o:before { + content: "\f059"; } + +.fa.fa-volume-control-phone:before { + content: "\f2a0"; } + +.fa.fa-asl-interpreting:before { + content: "\f2a3"; } + +.fa.fa-deafness:before { + content: "\f2a4"; } + +.fa.fa-hard-of-hearing:before { + content: "\f2a4"; } + +.fa.fa-glide { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-glide-g { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-signing:before { + content: "\f2a7"; } + +.fa.fa-viadeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa.fa-snapchat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa.fa-snapchat-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa.fa-pied-piper { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-first-order { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yoast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-themeisle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official:before { + content: "\f2b3"; } + +.fa.fa-google-plus-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-circle:before { + content: "\f2b3"; } + +.fa.fa-font-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa:before { + content: "\f2b4"; } + +.fa.fa-handshake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-handshake-o:before { + content: "\f2b5"; } + +.fa.fa-envelope-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-open-o:before { + content: "\f2b6"; } + +.fa.fa-linode { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-address-book-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-book-o:before { + content: "\f2b9"; } + +.fa.fa-vcard:before { + content: "\f2bb"; } + +.fa.fa-address-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-card-o:before { + content: "\f2bb"; } + +.fa.fa-vcard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-vcard-o:before { + content: "\f2bb"; } + +.fa.fa-user-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-circle-o:before { + content: "\f2bd"; } + +.fa.fa-user-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-o:before { + content: "\f007"; } + +.fa.fa-id-badge { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license:before { + content: "\f2c2"; } + +.fa.fa-id-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-id-card-o:before { + content: "\f2c2"; } + +.fa.fa-drivers-license-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license-o:before { + content: "\f2c2"; } + +.fa.fa-quora { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-free-code-camp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-telegram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-thermometer-4:before { + content: "\f2c7"; } + +.fa.fa-thermometer:before { + content: "\f2c7"; } + +.fa.fa-thermometer-3:before { + content: "\f2c8"; } + +.fa.fa-thermometer-2:before { + content: "\f2c9"; } + +.fa.fa-thermometer-1:before { + content: "\f2ca"; } + +.fa.fa-thermometer-0:before { + content: "\f2cb"; } + +.fa.fa-bathtub:before { + content: "\f2cd"; } + +.fa.fa-s15:before { + content: "\f2cd"; } + +.fa.fa-window-maximize { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-restore { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle:before { + content: "\f410"; } + +.fa.fa-window-close-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-close-o:before { + content: "\f410"; } + +.fa.fa-times-rectangle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle-o:before { + content: "\f410"; } + +.fa.fa-bandcamp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-grav { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-etsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-imdb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ravelry { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast:before { + content: "\f2da"; } + +.fa.fa-snowflake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-snowflake-o:before { + content: "\f2dc"; } + +.fa.fa-superpowers { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpexplorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-meetup { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } diff --git a/docs/deps/font-awesome-6.5.2/css/v4-shims.min.css b/docs/deps/font-awesome-6.5.2/css/v4-shims.min.css new file mode 100644 index 00000000..09baf5fc --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/v4-shims.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-envelope-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-home:before{content:"\f015"}.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-list-alt:before{content:"\f022"}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-edit{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit:before{content:"\f044"}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart-o:before,.fa.fa-bar-chart:before{content:"\e0e3"}.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-twitter-square:before{content:"\f081"}.fa.fa-facebook-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square:before{content:"\f082"}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-github-square:before{content:"\f092"}.fa.fa-lemon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-globe:before{content:"\f57d"}.fa.fa-tasks:before{content:"\f828"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-cut:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-save:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-magic:before{content:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square:before{content:"\f0d3"}.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-square:before{content:"\f0d4"}.fa.fa-google-plus{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f625"}.fa.fa-comment-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard:before{content:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f0ed"}.fa.fa-cloud-upload:before{content:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f5c0"}.fa.fa-star-half-empty{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f5c0"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before,.fa.fa-unlink:before{content:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt:before{content:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\24"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\e1bc"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f884"}.fa.fa-sort-amount-desc:before{content:"\f160"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-square:before{content:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square:before{content:"\f169"}.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square:before{content:"\f174"}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo-square:before{content:"\f194"}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square:before{content:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square:before{content:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square:before{content:"\f1b7"}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy:before,.fa.fa-life-buoy:before,.fa.fa-life-saver:before,.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-git-square:before{content:"\f1d2"}.fa.fa-git,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-futbol-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square:before{content:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before,.fa.fa-transgender:before{content:"\f224"}.fa.fa-transgender-alt:before{content:"\f225"}.fa.fa-facebook-official{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square:before{content:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square:before{content:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost:before{content:"\f2ab"}.fa.fa-snapchat-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-square:before{content:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400} \ No newline at end of file diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..1fbb1f7c Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..5d280216 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..549d68dc Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..18400d7f Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..bb2a8695 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..758dd4f6 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf new file mode 100644 index 00000000..8c5864c4 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 00000000..f94bec22 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 differ diff --git a/docs/deps/headroom-0.11.0/headroom.min.js b/docs/deps/headroom-0.11.0/headroom.min.js new file mode 100644 index 00000000..433069fd --- /dev/null +++ b/docs/deps/headroom-0.11.0/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.11.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=ls.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t,n){n=n||{},Object.assign(this,o.options,n),this.classes=Object.assign({},o.options.classes,n.classes),this.elem=t,this.tolerance=function(t){return t===Object(t)?t:{down:t,up:t}}(this.tolerance),this.initialised=!1,this.frozen=!1}return o.prototype={constructor:o,init:function(){return o.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},o.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},o.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),o}); \ No newline at end of file diff --git a/docs/deps/headroom-0.11.0/jQuery.headroom.min.js b/docs/deps/headroom-0.11.0/jQuery.headroom.min.js new file mode 100644 index 00000000..17f70c9e --- /dev/null +++ b/docs/deps/headroom-0.11.0/jQuery.headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.9.4 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2017 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(a){a&&(a.fn.headroom=function(b){return this.each(function(){var c=a(this),d=c.data("headroom"),e="object"==typeof b&&b;e=a.extend(!0,{},Headroom.options,e),d||(d=new Headroom(this,e),d.init(),c.data("headroom",d)),"string"==typeof b&&(d[b](),"destroy"===b&&c.removeData("headroom"))})},a("[data-headroom]").each(function(){var b=a(this);b.headroom(b.data())}))}(window.Zepto||window.jQuery); \ No newline at end of file diff --git a/docs/deps/jquery-3.6.0/jquery-3.6.0.js b/docs/deps/jquery-3.6.0/jquery-3.6.0.js new file mode 100644 index 00000000..fc6c299b --- /dev/null +++ b/docs/deps/jquery-3.6.0/jquery-3.6.0.js @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " - - - - - - - + + + + + + + - - - -
    -
    - + + Skip to contents +
    -
    + dsBaseClient -
    + 7.0.0.9000 + + + + + + + +
    +
    +
    +

    dsBaseClient: ‘DataSHIELD’ Client Side Base Functions

    License R build status Codecov test coverage

    @@ -72,8 +60,8 @@

    Installationinstall.packages("remotes") remotes::install_github("datashield/dsBaseClient", "<BRANCH>") -# Install v6.3.5 with the following -remotes::install_github("datashield/dsBaseClient", "6.3.5")

    +# Install v7.0.0 with the following +remotes::install_github("datashield/dsBaseClient", "7.0.0")

    For a full list of development branches, checkout https://github.com/datashield/dsBaseClient/branches

    @@ -124,10 +112,14 @@

    References - -

    - diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..a8b17d92 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,105 @@ +## dsBaseClient: ‘DataSHIELD’ Client Side Base Functions + +[![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html) +[![](https://www.r-pkg.org/badges/version/dsBaseClient?color=black)](https://cran.r-project.org/package=dsBaseClient) +[![R build +status](https://github.com/datashield/dsBaseClient/workflows/R-CMD-check/badge.svg)](https://github.com/datashield/dsBaseClient/actions) +[![Codecov test +coverage](https://codecov.io/gh/datashield/dsBaseClient/graph/badge.svg)](https://app.codecov.io/gh/datashield/dsBaseClient) + +## Installation + +You can install the released version of dsBaseClient from +[CRAN](https://cran.r-project.org/package=dsBaseClient) with: + +``` r +install.packages("dsBaseClient") +``` + +And the development version from +[GitHub](https://github.com/datashield/dsBaseClient/) with: + +``` r +install.packages("remotes") +remotes::install_github("datashield/dsBaseClient", "") + +# Install v7.0.0 with the following +remotes::install_github("datashield/dsBaseClient", "7.0.0") +``` + +For a full list of development branches, checkout + + +## About + +DataSHIELD is a software package which allows you to do non-disclosive +federated analysis on sensitive data. Our website +() has in depth descriptions of what it is, +how it works and how to install it. A key point to highlight is that +DataSHIELD has a client-server infrastructure, so the dsBase package +() needs to be used in conjunction +with the dsBaseClient package +() - trying to use one +without the other makes no sense. + +Detailed instructions on how to install DataSHIELD are at +. + +Discussion and help with using DataSHIELD can be obtained from The +DataSHIELD Forum + +The code here is organised as: + +| Location | What is it? | +|---------------|---------------------------------------------------------| +| obiba CRAN | Where you probably should install DataSHIELD from. | +| releases | Stable releases. | +| master branch | Mostly in sync with the latest release, changes rarely. | + +## References + +\[1\] Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, +Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, +Escribà Montagut X, Wheater S (2025). *dsBaseClient: ‘DataSHIELD’ Client +Side Base Functions*. R package version 6.3.5. + +\[2\] Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion +J, Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, +Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Oliver Schmidt C, +Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, +Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips +C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van +den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, +Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014). “DataSHIELD: +taking the analysis to the data, not the data to the analysis.” +*International Journal of Epidemiology*, *43*(6), 1929-1944. +. + +\[3\] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, +Murtagh M, R. Burton P (2017). “DataSHIELD – New Directions and +Dimensions.” *Data Science Journal*, *16*(21), 1-21. +. + +\[4\] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters +O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, +Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde +E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, +Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, +Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). +“DataSHIELD: mitigating disclosure risk in a multi-site federated +analysis platform.” *Bioinformatics Advances*, *5*(1), 1-21. +. + +> ***Note:*** Apple Mx architecture users, please be aware that there +> are some numerical limitations on this platform, which leads to +> unexpected results when using base R packages, like stats​. +> +> x \<- c(0, 3, 7) +> +> 1 - cor(x, x)​ +> +> The above should result in a value of zero. +> +> *Also See:* For more details see +> +> and the bug report: diff --git a/docs/katex-auto.js b/docs/katex-auto.js new file mode 100644 index 00000000..2adab3a9 --- /dev/null +++ b/docs/katex-auto.js @@ -0,0 +1,16 @@ +// https://github.com/jgm/pandoc/blob/29fa97ab96b8e2d62d48326e1b949a71dc41f47a/src/Text/Pandoc/Writers/HTML.hs#L332-L345 +document.addEventListener("DOMContentLoaded", function () { + var mathElements = document.getElementsByClassName("math"); + var macros = []; + for (var i = 0; i < mathElements.length; i++) { + var texText = mathElements[i].firstChild; + if (mathElements[i].tagName == "SPAN") { + katex.render(texText.data, mathElements[i], { + displayMode: mathElements[i].classList.contains("display"), + throwOnError: false, + macros: macros, + fleqn: false + }); + } + } +}); diff --git a/docs/lightswitch.js b/docs/lightswitch.js new file mode 100644 index 00000000..3808ca11 --- /dev/null +++ b/docs/lightswitch.js @@ -0,0 +1,85 @@ + +/*! + * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + * Updates for {pkgdown} by the {bslib} authors, also licensed under CC-BY-3.0. + */ + +const getStoredTheme = () => localStorage.getItem('theme') +const setStoredTheme = theme => localStorage.setItem('theme', theme) + +const getPreferredTheme = () => { + const storedTheme = getStoredTheme() + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' +} + +const setTheme = theme => { + if (theme === 'auto') { + document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + } +} + +function bsSetupThemeToggle() { + 'use strict' + + const showActiveTheme = (theme, focus = false) => { + var activeLabel, activeIcon; + + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + const buttonTheme = element.getAttribute('data-bs-theme-value') + const isActive = buttonTheme == theme + + element.classList.toggle('active', isActive) + element.setAttribute('aria-pressed', isActive) + + if (isActive) { + activeLabel = element.textContent; + activeIcon = element.querySelector('span').classList.value; + } + }) + + const themeSwitcher = document.querySelector('#dropdown-lightswitch') + if (!themeSwitcher) { + return + } + + themeSwitcher.setAttribute('aria-label', activeLabel) + themeSwitcher.querySelector('span').classList.value = activeIcon; + + if (focus) { + themeSwitcher.focus() + } + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + const storedTheme = getStoredTheme() + if (storedTheme !== 'light' && storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document + .querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + setTheme(theme) + setStoredTheme(theme) + showActiveTheme(theme, true) + }) + }) + }) +} + +setTheme(getPreferredTheme()); +bsSetupThemeToggle(); diff --git a/docs/llms.txt b/docs/llms.txt new file mode 100644 index 00000000..43a8e8fd --- /dev/null +++ b/docs/llms.txt @@ -0,0 +1,333 @@ +## dsBaseClient: ‘DataSHIELD’ Client Side Base Functions + +[![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html) +[![](https://www.r-pkg.org/badges/version/dsBaseClient?color=black)](https://cran.r-project.org/package=dsBaseClient) +[![R build +status](https://github.com/datashield/dsBaseClient/workflows/R-CMD-check/badge.svg)](https://github.com/datashield/dsBaseClient/actions) +[![Codecov test +coverage](https://codecov.io/gh/datashield/dsBaseClient/graph/badge.svg)](https://app.codecov.io/gh/datashield/dsBaseClient) + +## Installation + +You can install the released version of dsBaseClient from +[CRAN](https://cran.r-project.org/package=dsBaseClient) with: + +``` r +install.packages("dsBaseClient") +``` + +And the development version from +[GitHub](https://github.com/datashield/dsBaseClient/) with: + +``` r +install.packages("remotes") +remotes::install_github("datashield/dsBaseClient", "") + +# Install v7.0.0 with the following +remotes::install_github("datashield/dsBaseClient", "7.0.0") +``` + +For a full list of development branches, checkout + + +## About + +DataSHIELD is a software package which allows you to do non-disclosive +federated analysis on sensitive data. Our website +() has in depth descriptions of what it is, +how it works and how to install it. A key point to highlight is that +DataSHIELD has a client-server infrastructure, so the dsBase package +() needs to be used in conjunction +with the dsBaseClient package +() - trying to use one +without the other makes no sense. + +Detailed instructions on how to install DataSHIELD are at +. + +Discussion and help with using DataSHIELD can be obtained from The +DataSHIELD Forum + +The code here is organised as: + +| Location | What is it? | +|---------------|---------------------------------------------------------| +| obiba CRAN | Where you probably should install DataSHIELD from. | +| releases | Stable releases. | +| master branch | Mostly in sync with the latest release, changes rarely. | + +## References + +\[1\] Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg A, +Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye A, +Escribà Montagut X, Wheater S (2025). *dsBaseClient: ‘DataSHIELD’ Client +Side Base Functions*. R package version 6.3.5. + +\[2\] Gaye A, Marcon Y, Isaeva J, LaFlamme P, Turner A, Jones E, Minion +J, Boyd A, Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir I, +Doiron D, Giepmans L, Wallace S, Budin-Ljøsne I, Oliver Schmidt C, +Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, +Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry I, Peters A, Phillips +C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van +den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier I, Harris J, +Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014). “DataSHIELD: +taking the analysis to the data, not the data to the analysis.” +*International Journal of Epidemiology*, *43*(6), 1929-1944. +. + +\[3\] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner A, +Murtagh M, R. Burton P (2017). “DataSHIELD – New Directions and +Dimensions.” *Data Science Journal*, *16*(21), 1-21. +. + +\[4\] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters +O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, +Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde +E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan A, Murtagh M, +Nestor M, Nybo Andersen A, Parker S, Pinot de Moira A, Schwarz F, +Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). +“DataSHIELD: mitigating disclosure risk in a multi-site federated +analysis platform.” *Bioinformatics Advances*, *5*(1), 1-21. +. + +> ***Note:*** Apple Mx architecture users, please be aware that there +> are some numerical limitations on this platform, which leads to +> unexpected results when using base R packages, like stats​. +> +> x \<- c(0, 3, 7) +> +> 1 - cor(x, x)​ +> +> The above should result in a value of zero. +> +> *Also See:* For more details see +> +> and the bug report: + +# Package index + +## All functions + +- [`ds.Boole()`](ds.Boole.md) : Converts a server-side R object into + Boolean indicators +- [`ds.abs()`](ds.abs.md) : Computes the absolute values of a variable +- [`ds.asCharacter()`](ds.asCharacter.md) : Converts a server-side R + object into a character class +- [`ds.asDataMatrix()`](ds.asDataMatrix.md) : Converts a server-side R + object into a matrix +- [`ds.asFactor()`](ds.asFactor.md) : Converts a server-side numeric + vector into a factor +- [`ds.asFactorSimple()`](ds.asFactorSimple.md) : Converts a numeric + vector into a factor +- [`ds.asInteger()`](ds.asInteger.md) : Converts a server-side R object + into an integer class +- [`ds.asList()`](ds.asList.md) : Converts a server-side R object into a + list +- [`ds.asLogical()`](ds.asLogical.md) : Converts a server-side R object + into a logical class +- [`ds.asMatrix()`](ds.asMatrix.md) : Converts a server-side R object + into a matrix +- [`ds.asNumeric()`](ds.asNumeric.md) : Converts a server-side R object + into a numeric class +- [`ds.assign()`](ds.assign.md) : Assigns an R object to a name in the + server-side +- [`ds.auc()`](ds.auc.md) : Calculates the Area under the curve (AUC) +- [`ds.boxPlot()`](ds.boxPlot.md) : Draw boxplot +- [`ds.boxPlotGG()`](ds.boxPlotGG.md) : Renders boxplot +- [`ds.boxPlotGG_data_Treatment()`](ds.boxPlotGG_data_Treatment.md) : + Take a data frame on the server side an arrange it to pass it to the + boxplot function +- [`ds.boxPlotGG_data_Treatment_numeric()`](ds.boxPlotGG_data_Treatment_numeric.md) + : Take a vector on the server side an arrange it to pass it to the + boxplot function +- [`ds.boxPlotGG_numeric()`](ds.boxPlotGG_numeric.md) : Draw boxplot + with information from a numeric vector +- [`ds.boxPlotGG_table()`](ds.boxPlotGG_table.md) : Draw boxplot with + information from a data frame +- [`ds.bp_standards()`](ds.bp_standards.md) : Calculates Blood pressure + z-scores +- [`ds.c()`](ds.c.md) : Combines values into a vector or list in the + server-side +- [`ds.cbind()`](ds.cbind.md) : Combines R objects by columns in the + server-side +- [`ds.changeRefGroup()`](ds.changeRefGroup.md) : Changes the reference + level of a factor in the server-side +- [`ds.class()`](ds.class.md) : Class of the R object in the server-side +- [`ds.colnames()`](ds.colnames.md) : Produces column names of the R + object in the server-side +- [`ds.completeCases()`](ds.completeCases.md) : Identifies complete + cases in server-side R objects +- [`ds.contourPlot()`](ds.contourPlot.md) : Generates a contour plot +- [`ds.cor()`](ds.cor.md) : Calculates the correlation of R objects in + the server-side +- [`ds.corTest()`](ds.corTest.md) : Tests for correlation between paired + samples in the server-side +- [`ds.cov()`](ds.cov.md) : Calculates the covariance of R objects in + the server-side +- [`ds.dataFrame()`](ds.dataFrame.md) : Generates a data frame object in + the server-side +- [`ds.dataFrameFill()`](ds.dataFrameFill.md) : Creates missing values + columns in the server-side +- [`ds.dataFrameSort()`](ds.dataFrameSort.md) : Sorts data frames in the + server-side +- [`ds.dataFrameSubset()`](ds.dataFrameSubset.md) : Sub-sets data frames + in the server-side +- [`ds.densityGrid()`](ds.densityGrid.md) : Generates a density grid in + the client-side +- [`ds.dim()`](ds.dim.md) : Retrieves the dimension of a server-side R + object +- [`ds.dmtC2S()`](ds.dmtC2S.md) : Copy a clientside data.frame, matrix + or tibble to the serverside +- [`ds.elspline()`](ds.elspline.md) : Basis for a piecewise linear + spline with meaningful coefficients +- [`ds.exists()`](ds.exists.md) : Checks if an object is defined on the + server-side +- [`ds.exp()`](ds.exp.md) : Computes the exponentials in the server-side +- [`ds.extractQuantiles()`](ds.extractQuantiles.md) : Secure ranking of + a vector across all sources and use of these ranks to estimate global + quantiles across all studies +- [`ds.forestplot()`](ds.forestplot.md) : Forestplot for SLMA models +- [`ds.gamlss()`](ds.gamlss.md) : Generalized Additive Models for + Location Scale and Shape +- [`ds.getWGSR()`](ds.getWGSR.md) : Computes the WHO Growth Reference + z-scores of anthropometric data +- [`ds.glm()`](ds.glm.md) : Fits Generalized Linear Model +- [`ds.glmPredict()`](ds.glmPredict.md) : Applies predict.glm() to a + serverside glm object +- [`ds.glmSLMA()`](ds.glmSLMA.md) : Fit a Generalized Linear Model (GLM) + with pooling via Study Level Meta-Analysis (SLMA) +- [`ds.glmSummary()`](ds.glmSummary.md) : Summarize a glm object on the + serverside +- [`ds.glmerSLMA()`](ds.glmerSLMA.md) : Fits Generalized Linear + Mixed-Effect Models via Study-Level Meta-Analysis +- [`ds.heatmapPlot()`](ds.heatmapPlot.md) : Generates a Heat Map plot +- [`ds.hetcor()`](ds.hetcor.md) : Heterogeneous Correlation Matrix +- [`ds.histogram()`](ds.histogram.md) : Generates a histogram plot +- [`ds.igb_standards()`](ds.igb_standards.md) : Converts birth + measurements to intergrowth z-scores/centiles +- [`ds.isNA()`](ds.isNA.md) : Checks if a server-side vector is empty +- [`ds.isValid()`](ds.isValid.md) : Checks if a server-side object is + valid +- [`ds.kurtosis()`](ds.kurtosis.md) : Calculates the kurtosis of a + numeric variable +- [`ds.length()`](ds.length.md) : Gets the length of an object in the + server-side +- [`ds.levels()`](ds.levels.md) : Produces levels attributes of a + server-side factor +- [`ds.lexis()`](ds.lexis.md) : Represents follow-up in multiple states + on multiple time scales +- [`ds.list()`](ds.list.md) : Constructs a list of objects in the + server-side +- [`ds.listClientsideFunctions()`](ds.listClientsideFunctions.md) : + Lists client-side functions +- [`ds.listDisclosureSettings()`](ds.listDisclosureSettings.md) : Lists + disclosure settings +- [`ds.listServersideFunctions()`](ds.listServersideFunctions.md) : + Lists server-side functions +- [`ds.lmerSLMA()`](ds.lmerSLMA.md) : Fits Linear Mixed-Effect model via + Study-Level Meta-Analysis +- [`ds.log()`](ds.log.md) : Computes logarithms in the server-side +- [`ds.look()`](ds.look.md) : Performs direct call to a server-side + aggregate function +- [`ds.ls()`](ds.ls.md) : lists all objects on a server-side environment +- [`ds.lspline()`](ds.lspline.md) : Basis for a piecewise linear spline + with meaningful coefficients +- [`ds.make()`](ds.make.md) : Calculates a new object in the server-side +- [`ds.matrix()`](ds.matrix.md) : Creates a matrix on the server-side +- [`ds.matrixDet()`](ds.matrixDet.md) : Calculates de determinant of a + matrix in the server-side +- [`ds.matrixDet.report()`](ds.matrixDet.report.md) : Returns matrix + determinant to the client-side +- [`ds.matrixDiag()`](ds.matrixDiag.md) : Calculates matrix diagonals in + the server-side +- [`ds.matrixDimnames()`](ds.matrixDimnames.md) : Specifies the dimnames + of the server-side matrix +- [`ds.matrixInvert()`](ds.matrixInvert.md) : Inverts a server-side + square matrix +- [`ds.matrixMult()`](ds.matrixMult.md) : Calculates tow matrix + multiplication in the server-side +- [`ds.matrixTranspose()`](ds.matrixTranspose.md) : Transposes a + server-side matrix +- [`ds.mdPattern()`](ds.mdPattern.md) : Display missing data patterns + with disclosure control +- [`ds.mean()`](ds.mean.md) : Computes server-side vector statistical + mean +- [`ds.meanByClass()`](ds.meanByClass.md) : Computes the mean and + standard deviation across categories +- [`ds.meanSdGp()`](ds.meanSdGp.md) : Computes the mean and standard + deviation across groups defined by one factor +- [`ds.merge()`](ds.merge.md) : Merges two data frames in the + server-side +- [`ds.message()`](ds.message.md) : Returns server-side messages to the + client-side +- [`ds.metadata()`](ds.metadata.md) : Gets the metadata associated with + a variable held on the server +- [`ds.mice()`](ds.mice.md) : Multivariate Imputation by Chained + Equations +- [`ds.names()`](ds.names.md) : Return the names of a list object +- [`ds.ns()`](ds.ns.md) : Generate a Basis Matrix for Natural Cubic + Splines +- [`ds.numNA()`](ds.numNA.md) : Gets the number of missing values in a + server-side vector +- [`ds.qlspline()`](ds.qlspline.md) : Basis for a piecewise linear + spline with meaningful coefficients +- [`ds.quantileMean()`](ds.quantileMean.md) : Computes the quantiles of + a server-side variable +- [`ds.rBinom()`](ds.rBinom.md) : Generates Binomial distribution in the + server-side +- [`ds.rNorm()`](ds.rNorm.md) : Generates Normal distribution in the + server-side +- [`ds.rPois()`](ds.rPois.md) : Generates Poisson distribution in the + server-side +- [`ds.rUnif()`](ds.rUnif.md) : Generates Uniform distribution in the + server-side +- [`ds.rbind()`](ds.rbind.md) : Combines R objects by rows in the + server-side +- [`ds.reShape()`](ds.reShape.md) : Reshapes server-side grouped data +- [`ds.recodeLevels()`](ds.recodeLevels.md) : Recodes the levels of a + server-side factor vector +- [`ds.recodeValues()`](ds.recodeValues.md) : Recodes server-side + variable values +- [`ds.rep()`](ds.rep.md) : Creates a repetitive sequence in the + server-side +- [`ds.replaceNA()`](ds.replaceNA.md) : Replaces the missing values in a + server-side vector +- [`ds.rm()`](ds.rm.md) : Deletes server-side R objects +- [`ds.rowColCalc()`](ds.rowColCalc.md) : Computes rows and columns sums + and means in the server-side +- [`ds.sample()`](ds.sample.md) : Performs random sampling and permuting + of vectors, dataframes and matrices +- [`ds.scatterPlot()`](ds.scatterPlot.md) : Generates non-disclosive + scatter plots +- [`ds.seq()`](ds.seq.md) : Generates a sequence in the server-side +- [`ds.setSeed()`](ds.setSeed.md) : Server-side random number generation +- [`ds.skewness()`](ds.skewness.md) : Calculates the skewness of a + server-side numeric variable +- [`ds.sqrt()`](ds.sqrt.md) : Computes the square root values of a + variable +- [`ds.subset()`](ds.subset.md) : Generates a valid subset of a table or + a vector +- [`ds.subsetByClass()`](ds.subsetByClass.md) : Generates valid + subset(s) of a data frame or a factor +- [`ds.summary()`](ds.summary.md) : Generates the summary of a + server-side object +- [`ds.table()`](ds.table.md) : Generates 1-, 2-, and 3-dimensional + contingency tables with option of assigning to serverside only and + producing chi-squared statistics +- [`ds.table1D()`](ds.table1D.md) : Generates 1-dimensional contingency + tables +- [`ds.table2D()`](ds.table2D.md) : Generates 2-dimensional contingency + tables +- [`ds.tapply()`](ds.tapply.md) : Applies a Function Over a Server-Side + Ragged Array +- [`ds.tapply.assign()`](ds.tapply.assign.md) : Applies a Function Over + a Ragged Array on the server-side +- [`ds.testObjExists()`](ds.testObjExists.md) : Checks if an R object + exists on the server-side +- [`ds.unList()`](ds.unList.md) : Flattens Server-Side Lists +- [`ds.unique()`](ds.unique.md) : Perform 'unique' on a variable on the + server-side +- [`ds.var()`](ds.var.md) : Computes server-side vector variance +- [`ds.vectorCalc()`](ds.vectorCalc.md) : Performs a mathematical + operation on two or more vectors + diff --git a/docs/pkgdown.js b/docs/pkgdown.js index 6f0eee40..0a5573ae 100644 --- a/docs/pkgdown.js +++ b/docs/pkgdown.js @@ -1,108 +1,162 @@ /* http://gregfranko.com/blog/jquery-best-practices/ */ -(function($) { - $(function() { +(function ($) { + $(function () { - $('.navbar-fixed-top').headroom(); + $('nav.navbar').headroom(); - $('body').css('padding-top', $('.navbar').height() + 10); - $(window).resize(function(){ - $('body').css('padding-top', $('.navbar').height() + 10); + Toc.init({ + $nav: $("#toc"), + $scope: $("main h2, main h3, main h4, main h5, main h6") }); - $('[data-toggle="tooltip"]').tooltip(); - - var cur_path = paths(location.pathname); - var links = $("#navbar ul li a"); - var max_length = -1; - var pos = -1; - for (var i = 0; i < links.length; i++) { - if (links[i].getAttribute("href") === "#") - continue; - // Ignore external links - if (links[i].host !== location.host) - continue; - - var nav_path = paths(links[i].pathname); - - var length = prefix_length(nav_path, cur_path); - if (length > max_length) { - max_length = length; - pos = i; - } + if ($('#toc').length) { + $('body').scrollspy({ + target: '#toc', + offset: $("nav.navbar").outerHeight() + 1 + }); } - // Add class to parent
  • , and enclosing
  • if in dropdown - if (pos >= 0) { - var menu_anchor = $(links[pos]); - menu_anchor.parent().addClass("active"); - menu_anchor.closest("li.dropdown").addClass("active"); - } - }); - - function paths(pathname) { - var pieces = pathname.split("/"); - pieces.shift(); // always starts with / + // Activate popovers + $('[data-bs-toggle="popover"]').popover({ + container: 'body', + html: true, + trigger: 'focus', + placement: "top", + sanitize: false, + }); - var end = pieces[pieces.length - 1]; - if (end === "index.html" || end === "") - pieces.pop(); - return(pieces); - } + $('[data-bs-toggle="tooltip"]').tooltip(); - // Returns -1 if not found - function prefix_length(needle, haystack) { - if (needle.length > haystack.length) - return(-1); + /* Clipboard --------------------------*/ - // Special case for length-0 haystack, since for loop won't run - if (haystack.length === 0) { - return(needle.length === 0 ? 0 : -1); + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle = element.getAttribute('data-bs-original-title'); + element.setAttribute('data-bs-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-bs-original-title', tooltipOriginalTitle); } - for (var i = 0; i < haystack.length; i++) { - if (needle[i] != haystack[i]) - return(i); - } + if (ClipboardJS.isSupported()) { + $(document).ready(function () { + var copyButton = ""; - return(haystack.length); - } + $("div.sourceCode").addClass("hasCopyButton"); - /* Clipboard --------------------------*/ + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); - function changeTooltipMessage(element, msg) { - var tooltipOriginalTitle=element.getAttribute('data-original-title'); - element.setAttribute('data-original-title', msg); - $(element).tooltip('show'); - element.setAttribute('data-original-title', tooltipOriginalTitle); - } + // Initialize tooltips: + $('.btn-copy-ex').tooltip({ container: 'body' }); - if(ClipboardJS.isSupported()) { - $(document).ready(function() { - var copyButton = ""; + // Initialize clipboard: + var clipboard = new ClipboardJS('[data-clipboard-copy]', { + text: function (trigger) { + return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); + } + }); - $("div.sourceCode").addClass("hasCopyButton"); + clipboard.on('success', function (e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); - // Insert copy buttons: - $(copyButton).prependTo(".hasCopyButton"); + clipboard.on('error', function (e) { + changeTooltipMessage(e.trigger, 'Press Ctrl+C or Command+C to copy'); + }); - // Initialize tooltips: - $('.btn-copy-ex').tooltip({container: 'body'}); + }); + } - // Initialize clipboard: - var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { - text: function(trigger) { - return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); + /* Search marking --------------------------*/ + var url = new URL(window.location.href); + var toMark = url.searchParams.get("q"); + var mark = new Mark("main#main"); + if (toMark) { + mark.mark(toMark, { + accuracy: { + value: "complementary", + limiters: [",", ".", ":", "/"], } }); + } - clipboardBtnCopies.on('success', function(e) { - changeTooltipMessage(e.trigger, 'Copied!'); - e.clearSelection(); - }); + /* Search --------------------------*/ + /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ + // Initialise search index on focus + var fuse; + $("#search-input").focus(async function (e) { + if (fuse) { + return; + } - clipboardBtnCopies.on('error', function() { - changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); - }); + $(e.target).addClass("loading"); + var response = await fetch($("#search-input").data("search-index")); + var data = await response.json(); + + var options = { + keys: ["what", "text", "code"], + ignoreLocation: true, + threshold: 0.1, + includeMatches: true, + includeScore: true, + }; + fuse = new Fuse(data, options); + + $(e.target).removeClass("loading"); }); - } + + // Use algolia autocomplete + var options = { + autoselect: true, + debug: true, + hint: false, + minLength: 2, + }; + var q; + async function searchFuse(query, callback) { + await fuse; + + var items; + if (!fuse) { + items = []; + } else { + q = query; + var results = fuse.search(query, { limit: 20 }); + items = results + .filter((x) => x.score <= 0.75) + .map((x) => x.item); + if (items.length === 0) { + items = [{ dir: "Sorry 😿", previous_headings: "", title: "No results found.", what: "No results found.", path: window.location.href }]; + } + } + callback(items); + } + $("#search-input").autocomplete(options, [ + { + name: "content", + source: searchFuse, + templates: { + suggestion: (s) => { + if (s.title == s.what) { + return `${s.dir} >
    ${s.title}
    `; + } else if (s.previous_headings == "") { + return `${s.dir} >
    ${s.title}
    > ${s.what}`; + } else { + return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; + } + }, + }, + }, + ]).on('autocomplete:selected', function (event, s) { + window.location.href = s.path + "?q=" + q + "#" + s.id; + }); + }); })(window.jQuery || window.$) + +document.addEventListener('keydown', function (event) { + // Check if the pressed key is '/' + if (event.key === '/') { + event.preventDefault(); // Prevent any default action associated with the '/' key + document.getElementById('search-input').focus(); // Set focus to the search input + } +}); diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 7b44fe05..c6dc69b0 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,5 @@ pandoc: 3.1.3 -pkgdown: 2.2.0 +pkgdown: 2.2.1 pkgdown_sha: ~ articles: {} -last_built: 2025-11-21T17:12Z +last_built: 2026-07-20T14:11Z diff --git a/docs/reference/checkClass.html b/docs/reference/checkClass.html index 3dbe0638..4bf4f45c 100644 --- a/docs/reference/checkClass.html +++ b/docs/reference/checkClass.html @@ -1,54 +1,47 @@ -Checks that an object has the same class in all studies — checkClass • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    checkClass(datasources = NULL, obj = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    datasources
    @@ -60,33 +53,29 @@

    Arguments

    a string character, the name of the object to check for.

    -
    -

    Value

    +
    +

    Value

    a message or the class of the object if the object has the same class in all studies.

    -
    -

    Details

    +
    +

    Details

    In DataSHIELD an object included in analysis must be of the same type in all the collaborating studies. If that is not the case the process is stopped

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/checkClass.md b/docs/reference/checkClass.md new file mode 100644 index 00000000..61dedf20 --- /dev/null +++ b/docs/reference/checkClass.md @@ -0,0 +1,34 @@ +# Checks that an object has the same class in all studies + +This is an internal function. + +## Usage + +``` r +checkClass(datasources = NULL, obj = NULL) +``` + +## Arguments + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- obj: + + a string character, the name of the object to check for. + +## Value + +a message or the class of the object if the object has the same class in +all studies. + +## Details + +In DataSHIELD an object included in analysis must be of the same type in +all the collaborating studies. If that is not the case the process is +stopped diff --git a/docs/reference/colPercent.html b/docs/reference/colPercent.html index e526cfed..3ccd30f1 100644 --- a/docs/reference/colPercent.html +++ b/docs/reference/colPercent.html @@ -1,90 +1,79 @@ -Produces column percentages — colPercent • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    this is an INTERNAL function.

    -
    +
    +

    Usage

    colPercent(dataframe)
    -
    -

    Arguments

    +
    +

    Arguments

    dataframe

    a data frame

    -
    -

    Value

    +
    +

    Value

    a data frame

    -
    -

    Details

    +
    +

    Details

    The function is required required by the client function ds.table2D.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/colPercent.md b/docs/reference/colPercent.md new file mode 100644 index 00000000..0ca0b4ea --- /dev/null +++ b/docs/reference/colPercent.md @@ -0,0 +1,27 @@ +# Produces column percentages + +this is an INTERNAL function. + +## Usage + +``` r +colPercent(dataframe) +``` + +## Arguments + +- dataframe: + + a data frame + +## Value + +a data frame + +## Details + +The function is required required by the client function `ds.table2D`. + +## Author + +Gaye, A. diff --git a/docs/reference/computeWeightedMeans.html b/docs/reference/computeWeightedMeans.html index 8a396219..e7691ccd 100644 --- a/docs/reference/computeWeightedMeans.html +++ b/docs/reference/computeWeightedMeans.html @@ -1,58 +1,53 @@ -Compute Weighted Mean by Group — computeWeightedMeans • dsBaseClientCompute Weighted Mean by Group — computeWeightedMeans • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is originally from the panelaggregation package. It has been ported here in order to bypass the package being kicked off CRAN.

    -
    +
    +

    Usage

    computeWeightedMeans(data_table, variables, weight, by)
    -
    -

    Arguments

    +
    +

    Arguments

    data_table
    @@ -71,32 +66,28 @@

    Arguments

    character vector of the columns to group by

    -
    -

    Value

    +
    +

    Value

    Returns a data table object with computed weighted means.

    -
    -

    Author

    +
    +

    Author

    Matthias Bannert, Gabriel Bucur

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/computeWeightedMeans.md b/docs/reference/computeWeightedMeans.md new file mode 100644 index 00000000..d301815d --- /dev/null +++ b/docs/reference/computeWeightedMeans.md @@ -0,0 +1,37 @@ +# Compute Weighted Mean by Group + +This function is originally from the panelaggregation package. It has +been ported here in order to bypass the package being kicked off CRAN. + +## Usage + +``` r +computeWeightedMeans(data_table, variables, weight, by) +``` + +## Arguments + +- data_table: + + a data.table + +- variables: + + character name of the variable(s) to focus on. The variables must be + in the data.table + +- weight: + + character name of the data.table column that contains a weight. + +- by: + + character vector of the columns to group by + +## Value + +Returns a data table object with computed weighted means. + +## Author + +Matthias Bannert, Gabriel Bucur diff --git a/docs/reference/dot-pool_md_patterns.html b/docs/reference/dot-pool_md_patterns.html index e62ca744..8521f571 100644 --- a/docs/reference/dot-pool_md_patterns.html +++ b/docs/reference/dot-pool_md_patterns.html @@ -1,54 +1,47 @@ -Pool missing data patterns across studies — .pool_md_patterns • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Internal function to pool md.pattern results from multiple studies

    -
    +
    +

    Usage

    .pool_md_patterns(patterns_list, study_names)
    -
    -

    Arguments

    +
    +

    Arguments

    patterns_list
    @@ -59,28 +52,24 @@

    Arguments

    Names of the studies

    -
    -

    Value

    +
    +

    Value

    Pooled pattern matrix

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/dot-pool_md_patterns.md b/docs/reference/dot-pool_md_patterns.md new file mode 100644 index 00000000..9464be28 --- /dev/null +++ b/docs/reference/dot-pool_md_patterns.md @@ -0,0 +1,23 @@ +# Pool missing data patterns across studies + +Internal function to pool md.pattern results from multiple studies + +## Usage + +``` r +.pool_md_patterns(patterns_list, study_names) +``` + +## Arguments + +- patterns_list: + + List of pattern matrices from each study + +- study_names: + + Names of the studies + +## Value + +Pooled pattern matrix diff --git a/docs/reference/ds.Boole.html b/docs/reference/ds.Boole.html index dfee7fde..352494f8 100644 --- a/docs/reference/ds.Boole.html +++ b/docs/reference/ds.Boole.html @@ -1,55 +1,51 @@ -Converts a server-side R object into Boolean indicators — ds.Boole • dsBaseClientConverts a server-side R object into Boolean indicators — ds.Boole • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    It compares R objects using the standard set of Boolean operators (==, !=, >, >=, <, <=) to create a vector with Boolean indicators that can be of class logical (TRUE/FALSE) or numeric (1/0).

    -
    +
    +

    Usage

    ds.Boole(
       V1 = NULL,
       V2 = NULL,
    @@ -61,8 +57,8 @@ 

    Converts a server-side R object into Boolean indicators

    )
    -
    -

    Arguments

    +
    +

    Arguments

    V1
    @@ -101,16 +97,16 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.Boole returns the object specified by the newobj argument which is written to the server-side. Also, two validity messages are returned to the client-side indicating the name of the newobj which has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    A combination of different Boolean operators using AND operator can be obtained by multiplying two or more binary/Boolean vectors together. In this way, observations taking the value 1 in every vector @@ -126,13 +122,13 @@

    Details

    Server function called: BooleDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    
     if (FALSE) { # \dontrun{
     
    @@ -192,23 +188,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.Boole.md b/docs/reference/ds.Boole.md new file mode 100644 index 00000000..8d4327e4 --- /dev/null +++ b/docs/reference/ds.Boole.md @@ -0,0 +1,149 @@ +# Converts a server-side R object into Boolean indicators + +It compares R objects using the standard set of Boolean operators +(`==, !=, >, >=, <, <=`) to create a vector with Boolean indicators that +can be of class logical (`TRUE/FALSE`) or numeric (`1/0`). + +## Usage + +``` r +ds.Boole( + V1 = NULL, + V2 = NULL, + Boolean.operator = NULL, + numeric.output = TRUE, + na.assign = "NA", + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- V1: + + A character string specifying the name of the vector to which the + Boolean operator is to be applied. + +- V2: + + A character string specifying the name of the vector to compare with + `V1`. + +- Boolean.operator: + + A character string specifying one of six possible Boolean operators: + `'==', '!=', '>', '>=', '<'` and `'<='`. + +- numeric.output: + + logical. If TRUE the output variable should be of class numeric + (`1/0`). If FALSE the output variable should be of class logical + (`TRUE/FALSE`). Default TRUE. + +- na.assign: + + A character string taking values `'NA'`,`'1'` or `'0'`. Default + `'NA'`. For more information see details. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `boole.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.Boole` returns the object specified by the `newobj` argument which +is written to the server-side. Also, two validity messages are returned +to the client-side indicating the name of the `newobj` which has been +created in each data source and if it is in a valid form. + +## Details + +A combination of different Boolean operators using `AND` operator can be +obtained by multiplying two or more binary/Boolean vectors together. In +this way, observations taking the value 1 in every vector will then take +the value 1 in the final vector (after multiplication) while all others +will take the value 0. Instead the combination using `OR` operator can +be obtained by the sum of two or more vectors and applying `ds.Boole` +using the operator `>= 1`. + +In `na.assign` if `'NA'` is specified, the missing values remain as +`NA`s in the output vector. If `'1'` or `'0'` is specified the missing +values are converted to 1 or 0 respectively or `TRUE` or `FALSE` +depending on the argument `numeric.output`. + +Server function called: `BooleDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Generating Boolean indicators + ds.Boole(V1 = "D$LAB_TSC", + V2 = "D$LAB_TRIG", + Boolean.operator = ">", + numeric.output = TRUE, #Output vector of 0 and 1 + na.assign = "NA", + newobj = "Boole.vec", + datasources = connections[1]) #only the first server is used ("study1") + + ds.Boole(V1 = "D$LAB_TSC", + V2 = "D$LAB_TRIG", + Boolean.operator = "<", + numeric.output = FALSE, #Output vector of TRUE and FALSE + na.assign = "1", #NA values are converted to TRUE + newobj = "Boole.vec", + datasources = connections[2]) #only the second server is used ("study2") + + ds.Boole(V1 = "D$LAB_TSC", + V2 = "D$LAB_TRIG", + Boolean.operator = ">", + numeric.output = TRUE, #Output vector of 0 and 1 + na.assign = "0", #NA values are converted to 0 + newobj = "Boole.vec", + datasources = connections) #All servers are used + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } + +``` diff --git a/docs/reference/ds.abs.html b/docs/reference/ds.abs.html index 6c7416d1..dc7f0001 100644 --- a/docs/reference/ds.abs.html +++ b/docs/reference/ds.abs.html @@ -1,56 +1,50 @@ -Computes the absolute values of a variable — ds.abs • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Computes the absolute values for a specified numeric or integer vector. This function is similar to R function abs.

    -
    +
    +

    Usage

    ds.abs(x = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -68,27 +62,28 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.abs assigns a vector for each study that includes the absolute values of the input numeric or integer vector specified in the argument x. The created vectors are stored in the servers.

    -
    -

    Details

    +
    +

    Details

    The function calls the server-side function absDS that computes the absolute values of the elements of a numeric or integer vector and assigns a new vector with those absolute values on the server-side. The name of the new generated vector is specified by the user through the argument newobj, otherwise is named by default to abs.newobj.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # Connecting to the Opal servers
    @@ -142,23 +137,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.abs.md b/docs/reference/ds.abs.md new file mode 100644 index 00000000..e2c45637 --- /dev/null +++ b/docs/reference/ds.abs.md @@ -0,0 +1,105 @@ +# Computes the absolute values of a variable + +Computes the absolute values for a specified numeric or integer vector. +This function is similar to R function `abs`. + +## Usage + +``` r +ds.abs(x = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of a numeric or an integer + vector. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default name is set to `abs.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.abs` assigns a vector for each study that includes the absolute +values of the input numeric or integer vector specified in the argument +`x`. The created vectors are stored in the servers. + +## Details + +The function calls the server-side function `absDS` that computes the +absolute values of the elements of a numeric or integer vector and +assigns a new vector with those absolute values on the server-side. The +name of the new generated vector is specified by the user through the +argument `newobj`, otherwise is named by default to `abs.newobj`. + +## Author + +Demetris Avraam for DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Generate a normally distributed variable with zero mean and variance equal + # to one and then get their absolute values + ds.rNorm(samp.size=100, mean=0, sd=1, newobj='var.norm', datasources=connections) + # check the quantiles + ds.summary(x='var.norm', datasources=connections) + ds.abs(x='var.norm', newobj='var.norm.abs', datasources=connections) + # check now the changes in the quantiles + ds.summary(x='var.norm.abs', datasources=connections) + + # Example 2: Generate a sequence of negative integer numbers from -200 to -100 + # and then get their absolute values + ds.seq(FROM.value.char = '-200', TO.value.char = '-100', BY.value.char = '1', + newobj='negative.integers', datasources=connections) + # check the quantiles + ds.summary(x='negative.integers', datasources=connections) + ds.abs(x='negative.integers', newobj='positive.integers', datasources=connections) + # check now the changes in the quantiles + ds.summary(x='positive.integers', datasources=connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asCharacter.html b/docs/reference/ds.asCharacter.html index 3138fd8d..08befbae 100644 --- a/docs/reference/ds.asCharacter.html +++ b/docs/reference/ds.asCharacter.html @@ -1,56 +1,50 @@ -Converts a server-side R object into a character class — ds.asCharacter • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Converts the input object into a character class. This function is based on the native R function as.character.

    -
    +
    +

    Usage

    ds.asCharacter(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,24 +63,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asCharacter returns the object converted into a class character -that is written to the server-side. Also, two validity messages are returned to the client-side -indicating the name of the newobj which has been created in each data source and if -it is in a valid form.

    +that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    Server function called: asCharacterDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -124,23 +117,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asCharacter.md b/docs/reference/ds.asCharacter.md new file mode 100644 index 00000000..6e447965 --- /dev/null +++ b/docs/reference/ds.asCharacter.md @@ -0,0 +1,85 @@ +# Converts a server-side R object into a character class + +Converts the input object into a character class. This function is based +on the native R function `as.character`. + +## Usage + +``` r +ds.asCharacter(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to class character. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `ascharacter.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asCharacter` returns the object converted into a class character +that is written to the server-side. + +## Details + +Server function called: `asCharacterDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into a class character + ds.asCharacter(x.name = "D$LAB_TSC", + newobj = "char.obj", + datasources = connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asDataMatrix.html b/docs/reference/ds.asDataMatrix.html index c648b575..f14d4436 100644 --- a/docs/reference/ds.asDataMatrix.html +++ b/docs/reference/ds.asDataMatrix.html @@ -1,56 +1,50 @@ -Converts a server-side R object into a matrix — ds.asDataMatrix • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an R object into a matrix maintaining original class for all columns in data frames.

    -
    +
    +

    Usage

    ds.asDataMatrix(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,27 +63,24 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asDataMatrix returns the object converted into a matrix -that is written to the server-side. Also, two validity messages are returned -to the client-side -indicating the name of the newobj which -has been created in each data source and if -it is in a valid form.

    +that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    This function is based on the native R function data.matrix.

    Server function called: asDataMatrixDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -127,23 +118,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asDataMatrix.md b/docs/reference/ds.asDataMatrix.md new file mode 100644 index 00000000..3270021e --- /dev/null +++ b/docs/reference/ds.asDataMatrix.md @@ -0,0 +1,87 @@ +# Converts a server-side R object into a matrix + +Coerces an R object into a matrix maintaining original class for all +columns in data frames. + +## Usage + +``` r +ds.asDataMatrix(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to a matrix. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `asdatamatrix.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asDataMatrix` returns the object converted into a matrix that is +written to the server-side. + +## Details + +This function is based on the native R function `data.matrix`. + +Server function called: `asDataMatrixDS`. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into a matrix + ds.asDataMatrix(x.name = "D", + newobj = "mat.obj", + datasources = connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asFactor.html b/docs/reference/ds.asFactor.html index 1066af69..b9b81770 100644 --- a/docs/reference/ds.asFactor.html +++ b/docs/reference/ds.asFactor.html @@ -1,49 +1,42 @@ -Converts a server-side numeric vector into a factor — ds.asFactor • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function assigns a server-side numeric vector into a factor class.

    -
    +
    +

    Usage

    ds.asFactor(
       input.var.name = NULL,
       newobj.name = NULL,
    @@ -54,8 +47,8 @@ 

    Converts a server-side numeric vector into a factor

    )
    -
    -

    Arguments

    +
    +

    Arguments

    input.var.name
    @@ -93,15 +86,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asFactor returns the unique levels of the converted variable in ascending order and a validity message with the name of the created object on the client-side and the output matrix or vector in the server-side.

    -
    -

    Details

    +
    +

    Details

    Converts a numeric vector into a factor type which is represented either as a vector or as a matrix of dummy variables depending on the argument fixed.dummy.vars. The matrix of dummy variables also depends on the argument @@ -167,13 +160,13 @@

    Details

    the matrix of dummy variables is:

    DV1DV2DV3DV4DV5
    10000
    01000
    10000
    00100
    00010
    00010
    10000
    00100
    00010
    00001

    Server functions called: asFactorDS1 and asFactorDS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see Wiki
    @@ -221,23 +214,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asFactor.md b/docs/reference/ds.asFactor.md new file mode 100644 index 00000000..7566a863 --- /dev/null +++ b/docs/reference/ds.asFactor.md @@ -0,0 +1,238 @@ +# Converts a server-side numeric vector into a factor + +This function assigns a server-side numeric vector into a factor class. + +## Usage + +``` r +ds.asFactor( + input.var.name = NULL, + newobj.name = NULL, + forced.factor.levels = NULL, + fixed.dummy.vars = FALSE, + baseline.level = 1, + datasources = NULL +) +``` + +## Arguments + +- input.var.name: + + a character string which provides the name of the variable to be + converted to a factor. + +- newobj.name: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `asfactor.newobj`. + +- forced.factor.levels: + + the levels that the user wants to split the input variable. If NULL + (default) a vector with all unique levels from all studies are + created. + +- fixed.dummy.vars: + + boolean. If TRUE the input variable is converted to a factor but + presented as a matrix of dummy variables. If FALSE (default) the input + variable is converted to a factor and assigned as a vector. + +- baseline.level: + + an integer indicating the baseline level to be used in the creation of + the matrix with dummy variables. If the `fixed.dummy.vars` is set to + FALSE then any value of the baseline level is not taken into account. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asFactor` returns the unique levels of the converted variable in +ascending order and a validity message with the name of the created +object on the client-side and the output matrix or vector in the +server-side. + +## Details + +Converts a numeric vector into a factor type which is represented either +as a vector or as a matrix of dummy variables depending on the argument +`fixed.dummy.vars`. The matrix of dummy variables also depends on the +argument `baseline.level`. + +ds.asFactor.R and its associated serverside functions asFactorDS1 and +asFactorDS2 are to be used when you have variable that has up to 40 +unique levels across all sources combined. If one of the sources does +not contain any subjects at a particular level, that level will still be +created as an empty category. In the end all sources thus include a +factor variable with consistent factor levels across all sources - one +level for every unique value that occurs in at least one source. This is +important when you wish to fit models using ds.glm because the factor +levels must be consistent across all studies or the model will not fit. + +But in order for this to be possible, all sources have to share all of +the unique values their source holds for the variable. This allows the +client to create a single vector containing all of the unique factor +levels across ALL sources. But this is potentially disclosive if there +are too many levels. There are therefore two checks on the number of +levels in each source. One is simply a test of whether the number of +levels exceeds a value specified by the Roption value +'nfilter.max.levels' which is set by default to 40, but the data +custodian for the source can choose any alternative value he/she +chooses. The second test is of whether the levels are too dense: ie do +the number of levels exceed a specified proportion of the full length of +the relevant vector in the particular source. The max density is set by +the Roption value 'nfilter.levels' which takes the default value 0.33 +but can again be modified by the data custodian. + +In combination, these two checks mean that if a factor has 35 levels in +a given study where the total length of the variable to be converted to +a factor is 1000 individuals, the ds.asFactor function will process that +variable appropriately. But if it had had 45 levels it would have been +blocked by 'nfilter.max.levels' and if the total length of the variable +in that study had only been 70 subjects it would have been blocked by +the density criterion held in 'nfilter.levels'. + +If you have a factor with more than 40 levels in each source - perhaps +most commonly an ID of some sort that you need to provide as an argument +to eg a tapply function. Then you cannot use ds.asFactor. Typically in +these circumstance you simply want to create a factor that is +appropriate for each source but you do not need to ensure that all +levels are consistent across all sources. In that case, you can use the +ds.asFactorSimple function which does no more than coerce a numeric or +character variable to a factor. Because you do not need to share unique +factor levels between sources, there is then no disclosure issue. + +To understand how the matrix of the dummy variable is created let's +assume that we have the vector `(1, 2, 1, 3, 4, 4, 1, 3, 4, 5)` of ten +integer numbers. If we set the argument `fixed.dummy.vars = TRUE`, +`baseline.level = 1` and `forced.factor.levels = c(1,2,3,4,5)`. The +input vector is converted to the following matrix of dummy variables: + +| | | | | +|---------|---------|---------|---------| +| **DV2** | **DV3** | **DV4** | **DV5** | +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 0 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 0 | 0 | 0 | +| 0 | 1 | 0 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 0 | 0 | 1 | + +For the same example if the `baseline.level = 3` then the matrix is: + +| | | | | +|---------|---------|---------|---------| +| **DV1** | **DV2** | **DV4** | **DV5** | +| 1 | 0 | 0 | 0 | +| 0 | 1 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 0 | 1 | 0 | +| 1 | 0 | 0 | 0 | +| 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 0 | +| 0 | 0 | 0 | 1 | + +In the first instance the first row of the matrix has zeros in all +entries indicating that the first data point belongs to level 1 (as the +baseline level is equal to 1). The second row has 1 at the first (`DV2`) +column and zeros elsewhere, indicating that the second data point +belongs to level 2. In the second instance (second matrix) where the +baseline level is equal to 3, the first row of the matrix has 1 at the +first (`DV1`) column and zeros elsewhere, indicating again that the +first data point belongs to level 1. Also as we can see the fourth row +of the second matrix has all its elements equal to zero indicating that +the fourth data point belongs to level 3 (as the baseline level, in that +case, is 3). + +If the `baseline.level` is set to be equal to a value that is not one of +the levels of the factor then a matrix of dummy variables is created +having as many columns as the number of levels. In that case in each row +there is a unique entry equal to 1 at a certain column indicating the +level of each data point. So, for the above example where the vector has +five levels if we set the `baseline.level` equal to a value that does +not belong to those five levels (`baseline.level=8`) the matrix of dummy +variables is: + +| | | | | | +|---------|---------|---------|---------|---------| +| **DV1** | **DV2** | **DV3** | **DV4** | **DV5** | +| 1 | 0 | 0 | 0 | 0 | +| 0 | 1 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 0 | 0 | +| 0 | 0 | 0 | 1 | 0 | +| 0 | 0 | 0 | 1 | 0 | +| 1 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 0 | 0 | +| 0 | 0 | 0 | 1 | 0 | +| 0 | 0 | 0 | 0 | 1 | + +Server functions called: `asFactorDS1` and `asFactorDS2` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + ds.asFactor(input.var.name = "D$PM_BMI_CATEGORICAL", + newobj.name = "fact.obj", + forced.factor.levels = NULL, #a vector with all unique levels + #from all studies is created + fixed.dummy.vars = TRUE, #create a matrix of dummy variables + baseline.level = 1, + datasources = connections)#all the Opal servers are used, in this case 3 + #(see above the connection to the servers) + ds.asFactor(input.var.name = "D$PM_BMI_CATEGORICAL", + newobj.name = "fact.obj", + forced.factor.levels = c(2,3), #the variable is split in 2 levels + fixed.dummy.vars = TRUE, #create a matrix of dummy variables + baseline.level = 1, + datasources = connections[1])#only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.asFactorSimple.html b/docs/reference/ds.asFactorSimple.html index 318c0cb5..c54c9646 100644 --- a/docs/reference/ds.asFactorSimple.html +++ b/docs/reference/ds.asFactorSimple.html @@ -1,51 +1,45 @@ -Converts a numeric vector into a factor — ds.asFactorSimple • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    ds.asFactorSimple calls the assign function asFactorSimpleDS and thereby coerces a numeric or character vector into a factor

    -
    +
    +

    Usage

    ds.asFactorSimple(
       input.var.name = NULL,
       newobj.name = NULL,
    @@ -53,8 +47,8 @@ 

    Converts a numeric vector into a factor

    )
    -
    -

    Arguments

    +
    +

    Arguments

    input.var.name
    @@ -73,14 +67,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    an output vector of class factor to the serverside. In addition, returns a validity message with the name of the created object on the client-side and if creation fails an error message which can be viewed using datashield.errors().

    -
    -

    Details

    +
    +

    Details

    The function converts the input variable into a factor. Unlike ds.asFactor and its serverside functions, ds.asFactorSimple does no more than coerce the class of a variable to make it a factor on the serverside in each data source. @@ -90,28 +84,24 @@

    Details

    binary dummy variables that is equivalent to a factor. If you need to do any of these things you will have to use the ds.asFactor function.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asFactorSimple.md b/docs/reference/ds.asFactorSimple.md new file mode 100644 index 00000000..ab25118d --- /dev/null +++ b/docs/reference/ds.asFactorSimple.md @@ -0,0 +1,57 @@ +# Converts a numeric vector into a factor + +ds.asFactorSimple calls the assign function asFactorSimpleDS and thereby +coerces a numeric or character vector into a factor + +## Usage + +``` r +ds.asFactorSimple( + input.var.name = NULL, + newobj.name = NULL, + datasources = NULL +) +``` + +## Arguments + +- input.var.name: + + a character string which provides the name of the variable to be + converted to a factor. + +- newobj.name: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `asfactor.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +an output vector of class factor to the serverside. In addition, returns +a validity message with the name of the created object on the +client-side and if creation fails an error message which can be viewed +using datashield.errors(). + +## Details + +The function converts the input variable into a factor. Unlike +ds.asFactor and its serverside functions, ds.asFactorSimple does no more +than coerce the class of a variable to make it a factor on the +serverside in each data source. It does not check for or enforce +consistency of factor levels across sources or allow you to force an +arbitrary set of levels unless those levels actually exist in the +sources. Furthermore, it does not allow you to create an array of binary +dummy variables that is equivalent to a factor. If you need to do any of +these things you will have to use the ds.asFactor function. + +## Author + +DataSHIELD Development Team diff --git a/docs/reference/ds.asInteger.html b/docs/reference/ds.asInteger.html index a8880380..9ea35337 100644 --- a/docs/reference/ds.asInteger.html +++ b/docs/reference/ds.asInteger.html @@ -1,56 +1,50 @@ -Converts a server-side R object into an integer class — ds.asInteger • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an R object into an integer class. This function is based on the native R function as.integer.

    -
    +
    +

    Usage

    ds.asInteger(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,16 +63,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asInteger returns the R object converted into an integer -that is written to the server-side. Also, two validity messages are returned to the -client-side indicating the name of the newobj which -has been created in each data source and if -it is in a valid form.

    +that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    This function is based on the native R function as.integer. The only difference is that the DataSHIELD function first converts the values of the input object into characters and then convert @@ -95,13 +86,14 @@

    Details

    1 2 2 3 2 1 2 1 3 3 3 2

    Server function called: asIntegerDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -140,23 +132,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asInteger.md b/docs/reference/ds.asInteger.md new file mode 100644 index 00000000..00ea3e1e --- /dev/null +++ b/docs/reference/ds.asInteger.md @@ -0,0 +1,98 @@ +# Converts a server-side R object into an integer class + +Coerces an R object into an integer class. This function is based on the +native R function `as.integer`. + +## Usage + +``` r +ds.asInteger(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to an integer. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `asinteger.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asInteger` returns the R object converted into an integer that is +written to the server-side. + +## Details + +This function is based on the native R function `as.integer`. The only +difference is that the DataSHIELD function first converts the values of +the input object into characters and then convert those to integers. +This addition, it is important for the case where the input object is of +class factor having integers as levels. In that case, the native R +`as.integer` function returns the underlying level codes and not the +values as integers. For example `as.integer` in R converts the factor +vector: +\[1\] 0 1 1 2 1 0 1 0 2 2 2 1 +Levels: 0 1 2 +to the following integer vector: 1 2 2 3 2 1 2 1 3 3 3 2 + +Server function called: `asIntegerDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into an integer + ds.asInteger(x.name = "D$LAB_TSC", + newobj = "int.obj", + datasources = connections[1]) #only the first Opal server is used ("study1") + ds.class(x = "int.obj", datasources = connections[1]) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asList.html b/docs/reference/ds.asList.html index 8e1a6575..40d2b749 100644 --- a/docs/reference/ds.asList.html +++ b/docs/reference/ds.asList.html @@ -1,56 +1,50 @@ -Converts a server-side R object into a list — ds.asList • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an R object into a list. This function is based on the native R function as.list.

    -
    +
    +

    Usage

    ds.asList(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,24 +63,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asList returns the R object converted into a list -which is written to the server-side. Also, two validity messages are returned to the -client-side indicating the name of the newobj which has been created in each data -source and if it is in a valid form.

    +which is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    Server function called: asListDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -125,23 +118,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asList.md b/docs/reference/ds.asList.md new file mode 100644 index 00000000..b4ae1123 --- /dev/null +++ b/docs/reference/ds.asList.md @@ -0,0 +1,86 @@ +# Converts a server-side R object into a list + +Coerces an R object into a list. This function is based on the native R +function `as.list`. + +## Usage + +``` r +ds.asList(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to a list. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `aslist.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asList` returns the R object converted into a list which is written +to the server-side. + +## Details + +Server function called: `asListDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into a List + ds.asList(x.name = "D", + newobj = "D.asList", + datasources = connections[1]) #only the first Opal server is used ("study1") + ds.class(x = "D.asList", datasources = connections[1]) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asLogical.html b/docs/reference/ds.asLogical.html index 4399676b..1ec53921 100644 --- a/docs/reference/ds.asLogical.html +++ b/docs/reference/ds.asLogical.html @@ -1,56 +1,50 @@ -Converts a server-side R object into a logical class — ds.asLogical • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an R object into a logical class. This function is based on the native R function as.logical.

    -
    +
    +

    Usage

    ds.asLogical(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,25 +63,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asLogical returns the R object converted into a logical -that is written to the server-side. Also, two validity messages are returned -to the client-side indicating the name of the newobj which -has been created in each data source and if -it is in a valid form.

    +that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    Server function called: asLogicalDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -126,23 +118,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asLogical.md b/docs/reference/ds.asLogical.md new file mode 100644 index 00000000..f5110323 --- /dev/null +++ b/docs/reference/ds.asLogical.md @@ -0,0 +1,86 @@ +# Converts a server-side R object into a logical class + +Coerces an R object into a logical class. This function is based on the +native R function `as.logical`. + +## Usage + +``` r +ds.asLogical(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to a logical. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `aslogical.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asLogical` returns the R object converted into a logical that is +written to the server-side. + +## Details + +Server function called: `asLogicalDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into a logical + ds.asLogical(x.name = "D$LAB_TSC", + newobj = "logical.obj", + datasources =connections[1]) #only the first Opal server is used ("study1") + ds.class(x = "logical.obj", datasources = connections[1]) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asMatrix.html b/docs/reference/ds.asMatrix.html index bca61673..7527d2aa 100644 --- a/docs/reference/ds.asMatrix.html +++ b/docs/reference/ds.asMatrix.html @@ -1,56 +1,50 @@ -Converts a server-side R object into a matrix — ds.asMatrix • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an R object into a matrix. This converts all columns into character class.

    -
    +
    +

    Usage

    ds.asMatrix(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,28 +63,27 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asMatrix returns the object converted into a matrix -that is written to the server-side. Also, two validity messages are returned -to the client-side indicating the name of the newobj which -has been created in each data source and if it is in a valid form.

    +that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    This function is based on the native R function as.matrix. If this function is applied to a data frame, all columns are converted into a character class. If you wish to convert a data frame to a matrix but maintain all data columns in their original class you should use the function ds.asDataMatrix.

    Server function called: asMatrixDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -128,23 +121,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asMatrix.md b/docs/reference/ds.asMatrix.md new file mode 100644 index 00000000..c9f32c66 --- /dev/null +++ b/docs/reference/ds.asMatrix.md @@ -0,0 +1,91 @@ +# Converts a server-side R object into a matrix + +Coerces an R object into a matrix. This converts all columns into +character class. + +## Usage + +``` r +ds.asMatrix(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to a matrix. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `asmatrix.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asMatrix` returns the object converted into a matrix that is written +to the server-side. + +## Details + +This function is based on the native R function `as.matrix`. If this +function is applied to a data frame, all columns are converted into a +character class. If you wish to convert a data frame to a matrix but +maintain all data columns in their original class you should use the +function `ds.asDataMatrix`. + +Server function called: `asMatrixDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into a matrix + ds.asMatrix(x.name = "D", + newobj = "mat.obj", + datasources = connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.asNumeric.html b/docs/reference/ds.asNumeric.html index 74c90473..bd93df09 100644 --- a/docs/reference/ds.asNumeric.html +++ b/docs/reference/ds.asNumeric.html @@ -1,56 +1,50 @@ -Converts a server-side R object into a numeric class — ds.asNumeric • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an R object into a numeric class. This function is based on the native R function as.numeric.

    -
    +
    +

    Usage

    ds.asNumeric(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -69,16 +63,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.asNumeric returns the R object converted into a numeric class -that is written to the server-side. Also, two validity messages are returned -to the client-side indicating the name of the newobj which -has been created in each data source and if -it is in a valid form.

    +that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    This function is based on the native R function as.numeric. However, it behaves differently with some specific classes of variables. For example, if the input object is of class factor, it first converts its values into characters and then convert those to @@ -94,13 +85,14 @@

    Details

    levels to its original numeric values.

    Server function called: asNumericDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -139,23 +131,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.asNumeric.md b/docs/reference/ds.asNumeric.md new file mode 100644 index 00000000..760fdb05 --- /dev/null +++ b/docs/reference/ds.asNumeric.md @@ -0,0 +1,100 @@ +# Converts a server-side R object into a numeric class + +Coerces an R object into a numeric class. This function is based on the +native R function `as.numeric`. + +## Usage + +``` r +ds.asNumeric(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the input object to be + coerced to a numeric. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `asnumeric.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.asNumeric` returns the R object converted into a numeric class that +is written to the server-side. + +## Details + +This function is based on the native R function `as.numeric`. However, +it behaves differently with some specific classes of variables. For +example, if the input object is of class factor, it first converts its +values into characters and then convert those to numerics. This +behaviour is important for the case where the input object is of class +factor having numbers as levels. In that case, the native R `as.numeric` +function returns the underlying level codes and not the values as +numbers. For example `as.numeric` in R converts the factor vector: +0 1 1 2 1 0 1 0 2 2 2 1 +Levels: 0 1 2 +to the following numeric vector: 1 2 2 3 2 1 2 1 3 3 3 2 +In contrast DataSHIELD converts an input factor with numeric levels to +its original numeric values. + +Server function called: `asNumericDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Converting the R object into a numeric class + ds.asNumeric(x.name = "D$LAB_TSC", + newobj = "num.obj", + datasources = connections[1]) #only the first Opal server is used ("study1") + ds.class(x = "num.obj", datasources = connections[1]) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.assign.html b/docs/reference/ds.assign.html index a67e7380..256d6226 100644 --- a/docs/reference/ds.assign.html +++ b/docs/reference/ds.assign.html @@ -1,54 +1,47 @@ -Assigns an R object to a name in the server-side — ds.assign • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function assigns a datashield object to a name, hence creating a new object.

    -
    +
    +

    Usage

    ds.assign(toAssign = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    toAssign
    @@ -66,25 +59,25 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.assign returns the R object assigned to a name that is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    The new object is stored on the server-side.

    ds.assign causes a remote assignment by using DSI::datashield.assign. The toAssign argument is checked at the server and assigned the variable called newobj on the server-side.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -123,23 +116,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.assign.md b/docs/reference/ds.assign.md new file mode 100644 index 00000000..287c7ed6 --- /dev/null +++ b/docs/reference/ds.assign.md @@ -0,0 +1,87 @@ +# Assigns an R object to a name in the server-side + +This function assigns a datashield object to a name, hence creating a +new object. + +## Usage + +``` r +ds.assign(toAssign = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- toAssign: + + a character string providing the object to assign. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `assign.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.assign` returns the R object assigned to a name that is written to +the server-side. + +## Details + +The new object is stored on the server-side. + +`ds.assign` causes a remote assignment by using +[`DSI::datashield.assign`](https://datashield.github.io/DSI/reference/datashield.assign.html). +The `toAssign` argument is checked at the server and assigned the +variable called `newobj` on the server-side. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Assign a variable to a name + ds.assign(toAssign = "D$LAB_TSC", + newobj = "labtsc", + datasources = connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.auc.html b/docs/reference/ds.auc.html index 9e38f92d..5c7ee420 100644 --- a/docs/reference/ds.auc.html +++ b/docs/reference/ds.auc.html @@ -1,56 +1,50 @@ -Calculates the Area under the curve (AUC) — ds.auc • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the C-statistic or AUC for logistic regression models.

    -
    +
    +

    Usage

    ds.auc(pred = NULL, y = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    pred
    @@ -68,36 +62,32 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    returns the AUC and its standard error

    -
    -

    Details

    +
    +

    Details

    The AUC determines the discriminative ability of a model.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.auc.md b/docs/reference/ds.auc.md new file mode 100644 index 00000000..832d27f6 --- /dev/null +++ b/docs/reference/ds.auc.md @@ -0,0 +1,41 @@ +# Calculates the Area under the curve (AUC) + +This function calculates the C-statistic or AUC for logistic regression +models. + +## Usage + +``` r +ds.auc(pred = NULL, y = NULL, datasources = NULL) +``` + +## Arguments + +- pred: + + the name of the vector of the predicted values + +- y: + + the name of the outcome variable. Note that this variable should + include the complete cases that are used in the regression model. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +returns the AUC and its standard error + +## Details + +The AUC determines the discriminative ability of a model. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.boxPlot.html b/docs/reference/ds.boxPlot.html index 6e273535..249635c5 100644 --- a/docs/reference/ds.boxPlot.html +++ b/docs/reference/ds.boxPlot.html @@ -1,51 +1,45 @@ -Draw boxplot — ds.boxPlot • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Draw boxplot with data on the study servers (data frames or numeric vectors) with the option of grouping using categorical variables on the dataset (only for data frames)

    -
    +
    +

    Usage

    ds.boxPlot(
       x,
       variables = NULL,
    @@ -58,8 +52,8 @@ 

    Draw boxplot

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -96,32 +90,28 @@

    Arguments

    a list of DSConnection-class (default NULL) objects obtained after login

    -
    -

    Value

    +
    +

    Value

    ggplot object

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.boxPlot.md b/docs/reference/ds.boxPlot.md new file mode 100644 index 00000000..2ccf9ba0 --- /dev/null +++ b/docs/reference/ds.boxPlot.md @@ -0,0 +1,65 @@ +# Draw boxplot + +Draw boxplot with data on the study servers (data frames or numeric +vectors) with the option of grouping using categorical variables on the +dataset (only for data frames) + +## Usage + +``` r +ds.boxPlot( + x, + variables = NULL, + group = NULL, + group2 = NULL, + xlabel = "x axis", + ylabel = "y axis", + type = "pooled", + datasources = NULL +) +``` + +## Arguments + +- x: + + `character` Name of the data frame (or numeric vector) on the server + side that holds the information to be plotted + +- variables: + + `character vector` Name of the column(s) of the data frame to include + on the boxplot + +- group: + + `character` (default `NULL`) Name of the first grouping variable. + +- group2: + + `character` (default `NULL`) Name of the second grouping variable. + +- xlabel: + + `caracter` (default `"x axis"`) Label to put on the x axis of the plot + +- ylabel: + + `caracter` (default `"y axis"`) Label to put on the y axis of the plot + +- type: + + `character` Return a pooled plot (`"pooled"`) or a split plot (one for + each study server `"split"`) + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + (default `NULL`) objects obtained after login + +## Value + +`ggplot` object + +## Examples diff --git a/docs/reference/ds.boxPlotGG.html b/docs/reference/ds.boxPlotGG.html index 00ff6fc3..37aa5607 100644 --- a/docs/reference/ds.boxPlotGG.html +++ b/docs/reference/ds.boxPlotGG.html @@ -1,51 +1,45 @@ -Renders boxplot — ds.boxPlotGG • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Internal function. Renders a ggplot boxplot by retrieving from the server side a list with the identity stats and other parameters to render the plot without passing any data from the original dataset

    -
    +
    +

    Usage

    ds.boxPlotGG(
       x,
       group = NULL,
    @@ -57,8 +51,8 @@ 

    Renders boxplot

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -95,28 +89,24 @@

    Arguments

    a list of DSConnection-class (default NULL) objects obtained after login

    -
    -

    Value

    +
    +

    Value

    ggplot object

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.boxPlotGG.md b/docs/reference/ds.boxPlotGG.md new file mode 100644 index 00000000..b2024cec --- /dev/null +++ b/docs/reference/ds.boxPlotGG.md @@ -0,0 +1,64 @@ +# Renders boxplot + +Internal function. Renders a ggplot boxplot by retrieving from the +server side a list with the identity stats and other parameters to +render the plot without passing any data from the original dataset + +## Usage + +``` r +ds.boxPlotGG( + x, + group = NULL, + group2 = NULL, + xlabel = "x axis", + ylabel = "y axis", + type = "pooled", + datasources = NULL +) +``` + +## Arguments + +- x: + + `character` Name on the server side of the data frame to form a + boxplot. Structure on the server of this object must be: + + Column 'x': Names on the X axis of the boxplot, aka variables to + plot + Column 'value': Values for that variable (raw data of columns + rbinded) + Column 'group': (Optional) Values of the grouping variable + Column 'group2': (Optional) Values of the second grouping variable + +- group: + + `character` (default `NULL`) Name of the first grouping variable. + +- group2: + + `character` (default `NULL`) Name of the second grouping variable. + +- xlabel: + + `caracter` (default `"x axis"`) Label to put on the x axis of the plot + +- ylabel: + + `caracter` (default `"y axis"`) Label to put on the y axis of the plot + +- type: + + `character` Return a pooled plot (`"pooled"`) or a split plot (one for + each study server `"split"`) + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + (default `NULL`) objects obtained after login + +## Value + +`ggplot` object diff --git a/docs/reference/ds.boxPlotGG_data_Treatment.html b/docs/reference/ds.boxPlotGG_data_Treatment.html index 3c303a3f..9c1cb53e 100644 --- a/docs/reference/ds.boxPlotGG_data_Treatment.html +++ b/docs/reference/ds.boxPlotGG_data_Treatment.html @@ -1,49 +1,42 @@ -Take a data frame on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Internal function

    -
    +
    +

    Usage

    ds.boxPlotGG_data_Treatment(
       table,
       variables,
    @@ -53,8 +46,8 @@ 

    Take a data frame on the server side an arrange it to pass it to the boxplot )

    -
    -

    Arguments

    +
    +

    Arguments

    table
    @@ -77,8 +70,8 @@

    Arguments

    a list of DSConnection-class (default NULL) objects obtained after login

    -
    -

    Value

    +
    +

    Value

    Does not return nothing, it creates the table "boxPlotRawData" on the server arranged to be passed to the ggplot boxplot function. Structure of the created table:

    Column 'x': Names on the X axis of the boxplot, aka variables to plot
    @@ -87,23 +80,19 @@

    Value

    Column 'group2': (Optional) Values of the second grouping variable

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.boxPlotGG_data_Treatment.md b/docs/reference/ds.boxPlotGG_data_Treatment.md new file mode 100644 index 00000000..946f5b63 --- /dev/null +++ b/docs/reference/ds.boxPlotGG_data_Treatment.md @@ -0,0 +1,52 @@ +# Take a data frame on the server side an arrange it to pass it to the boxplot function + +Internal function + +## Usage + +``` r +ds.boxPlotGG_data_Treatment( + table, + variables, + group = NULL, + group2 = NULL, + datasources = NULL +) +``` + +## Arguments + +- table: + + `character` Name of the table on the server side that holds the + information to be plotted later + +- variables: + + `character vector` Name of the column(s) of the data frame to include + on the boxplot + +- group: + + `character` (default `NULL`) Name of the first grouping variable. + +- group2: + + `character` (default `NULL`) Name of the second grouping variable. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + (default `NULL`) objects obtained after login + +## Value + +Does not return nothing, it creates the table `"boxPlotRawData"` on the +server arranged to be passed to the ggplot boxplot function. Structure +of the created table: + +Column 'x': Names on the X axis of the boxplot, aka variables to plot +Column 'value': Values for that variable (raw data of columns rbinded) +Column 'group': (Optional) Values of the grouping variable +Column 'group2': (Optional) Values of the second grouping variable diff --git a/docs/reference/ds.boxPlotGG_data_Treatment_numeric.html b/docs/reference/ds.boxPlotGG_data_Treatment_numeric.html index c40d3302..600cd0e4 100644 --- a/docs/reference/ds.boxPlotGG_data_Treatment_numeric.html +++ b/docs/reference/ds.boxPlotGG_data_Treatment_numeric.html @@ -1,54 +1,47 @@ -Take a vector on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment_numeric • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Internal function

    -
    +
    +

    Usage

    ds.boxPlotGG_data_Treatment_numeric(vector, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    vector
    @@ -59,31 +52,27 @@

    Arguments

    a list of DSConnection-class (default NULL) objects obtained after login

    -
    -

    Value

    +
    +

    Value

    Does not return nothing, it creates the table "boxPlotRawDataNumeric" on the server arranged to be passed to the ggplot boxplot function. Structure of the created table:

    Column 'x': Names on the X axis of the boxplot, aka name of the vector (vector argument)
    Column 'value': Values for that variable

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.boxPlotGG_data_Treatment_numeric.md b/docs/reference/ds.boxPlotGG_data_Treatment_numeric.md new file mode 100644 index 00000000..da2076a6 --- /dev/null +++ b/docs/reference/ds.boxPlotGG_data_Treatment_numeric.md @@ -0,0 +1,32 @@ +# Take a vector on the server side an arrange it to pass it to the boxplot function + +Internal function + +## Usage + +``` r +ds.boxPlotGG_data_Treatment_numeric(vector, datasources = NULL) +``` + +## Arguments + +- vector: + + `character` Name of the table on the server side that holds the + information to be plotted later + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + (default `NULL`) objects obtained after login + +## Value + +Does not return nothing, it creates the table `"boxPlotRawDataNumeric"` +on the server arranged to be passed to the ggplot boxplot function. +Structure of the created table: + +Column 'x': Names on the X axis of the boxplot, aka name of the vector +(vector argument) +Column 'value': Values for that variable diff --git a/docs/reference/ds.boxPlotGG_numeric.html b/docs/reference/ds.boxPlotGG_numeric.html index 2026f88d..2e832653 100644 --- a/docs/reference/ds.boxPlotGG_numeric.html +++ b/docs/reference/ds.boxPlotGG_numeric.html @@ -1,49 +1,42 @@ -Draw boxplot with information from a numeric vector — ds.boxPlotGG_numeric • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Draw boxplot with information from a numeric vector

    -
    +
    +

    Usage

    ds.boxPlotGG_numeric(
       x,
       xlabel = "x axis",
    @@ -53,8 +46,8 @@ 

    Draw boxplot with information from a numeric vector

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -78,28 +71,24 @@

    Arguments

    a list of DSConnection-class (default NULL) objects obtained after login

    -
    -

    Value

    +
    +

    Value

    ggplot object

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.boxPlotGG_numeric.md b/docs/reference/ds.boxPlotGG_numeric.md new file mode 100644 index 00000000..3387eac9 --- /dev/null +++ b/docs/reference/ds.boxPlotGG_numeric.md @@ -0,0 +1,45 @@ +# Draw boxplot with information from a numeric vector + +Draw boxplot with information from a numeric vector + +## Usage + +``` r +ds.boxPlotGG_numeric( + x, + xlabel = "x axis", + ylabel = "y axis", + type = "pooled", + datasources = NULL +) +``` + +## Arguments + +- x: + + `character` Name of the numeric vector on the server side that holds + the information to be plotted + +- xlabel: + + `caracter` (default `"x axis"`) Label to put on the x axis of the plot + +- ylabel: + + `caracter` (default `"y axis"`) Label to put on the y axis of the plot + +- type: + + `character` Return a pooled plot (`"pooled"`) or a split plot (one for + each study server `"split"`) + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + (default `NULL`) objects obtained after login + +## Value + +`ggplot` object diff --git a/docs/reference/ds.boxPlotGG_table.html b/docs/reference/ds.boxPlotGG_table.html index 819848c9..44d09b53 100644 --- a/docs/reference/ds.boxPlotGG_table.html +++ b/docs/reference/ds.boxPlotGG_table.html @@ -1,49 +1,42 @@ -Draw boxplot with information from a data frame — ds.boxPlotGG_table • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Draws a boxplot with the option of adding two grouping variables from data held on a table

    -
    +
    +

    Usage

    ds.boxPlotGG_table(
       x,
       variables,
    @@ -56,8 +49,8 @@ 

    Draw boxplot with information from a data frame

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -93,28 +86,24 @@

    Arguments

    a list of DSConnection-class (default NULL) objects obtained after login

    -
    -

    Value

    +
    +

    Value

    ggplot object

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.boxPlotGG_table.md b/docs/reference/ds.boxPlotGG_table.md new file mode 100644 index 00000000..5c0ae092 --- /dev/null +++ b/docs/reference/ds.boxPlotGG_table.md @@ -0,0 +1,62 @@ +# Draw boxplot with information from a data frame + +Draws a boxplot with the option of adding two grouping variables from +data held on a table + +## Usage + +``` r +ds.boxPlotGG_table( + x, + variables, + group = NULL, + group2 = NULL, + xlabel = "x axis", + ylabel = "y axis", + type = "pooled", + datasources = NULL +) +``` + +## Arguments + +- x: + + `character` Name of the table on the server side that holds the + information to be plotted + +- variables: + + `character vector` Name of the column(s) of the data frame to include + on the boxplot + +- group: + + `character` (default `NULL`) Name of the first grouping variable. + +- group2: + + `character` (default `NULL`) Name of the second grouping variable. + +- xlabel: + + `caracter` (default `"x axis"`) Label to put on the x axis of the plot + +- ylabel: + + `caracter` (default `"y axis"`) Label to put on the y axis of the plot + +- type: + + `character` Return a pooled plot (`"pooled"`) or a split plot (one for + each study server `"split"`) + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + (default `NULL`) objects obtained after login + +## Value + +`ggplot` object diff --git a/docs/reference/ds.bp_standards.html b/docs/reference/ds.bp_standards.html index e44dc25a..804523e0 100644 --- a/docs/reference/ds.bp_standards.html +++ b/docs/reference/ds.bp_standards.html @@ -1,55 +1,51 @@ -Calculates Blood pressure z-scores — ds.bp_standards • dsBaseClientCalculates Blood pressure z-scores — ds.bp_standards • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function calculates blood pressure z-scores in two steps: Step 1. Calculates z-score of height according to CDC growth chart (Not the WHO growth chart!). Step 2. Calculates z-score of BP according to the fourth report on BP management, USA

    -
    +
    +

    Usage

    ds.bp_standards(
       sex = NULL,
       age = NULL,
    @@ -61,8 +57,8 @@ 

    Calculates Blood pressure z-scores

    )
    -
    -

    Arguments

    +
    +

    Arguments

    sex
    @@ -101,40 +97,36 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    assigns a new object on the server-side. The assigned object is a list with two elements: the 'Zbp' which is the zscores of the blood pressure and 'perc' which is the percentiles of the BP zscores.

    -
    -

    References

    +
    +

    References

    The fourth report on the diagnosis, evaluation, and treatment of high blood pressure in children and adolescents: https://www.nhlbi.nih.gov/sites/default/files/media/docs/hbp_ped.pdf

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.bp_standards.md b/docs/reference/ds.bp_standards.md new file mode 100644 index 00000000..4dab95b4 --- /dev/null +++ b/docs/reference/ds.bp_standards.md @@ -0,0 +1,76 @@ +# Calculates Blood pressure z-scores + +The function calculates blood pressure z-scores in two steps: Step 1. +Calculates z-score of height according to CDC growth chart (Not the WHO +growth chart!). Step 2. Calculates z-score of BP according to the fourth +report on BP management, USA + +## Usage + +``` r +ds.bp_standards( + sex = NULL, + age = NULL, + height = NULL, + bp = NULL, + systolic = TRUE, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- sex: + + the name of the sex variable. The variable should be coded as 1 for + males and 2 for females. If it is coded differently (e.g. 0/1), then + you can use the ds.recodeValues function to recode the categories to + 1/2 before the use of ds.bp_standards + +- age: + + the name of the age variable in years. + +- height: + + the name of the height variable in cm. + +- bp: + + the name of the blood pressure variable. + +- systolic: + + logical. If TRUE (default) the function assumes conversion of systolic + blood pressure. If FALSE the function assumes conversion of diastolic + blood pressure. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default name is set to `bp.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +assigns a new object on the server-side. The assigned object is a list +with two elements: the 'Zbp' which is the zscores of the blood pressure +and 'perc' which is the percentiles of the BP zscores. + +## References + +The fourth report on the diagnosis, evaluation, and treatment of high +blood pressure in children and adolescents: +https://www.nhlbi.nih.gov/sites/default/files/media/docs/hbp_ped.pdf + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.c.html b/docs/reference/ds.c.html index 301e4481..fa1bfb57 100644 --- a/docs/reference/ds.c.html +++ b/docs/reference/ds.c.html @@ -1,54 +1,47 @@ -Combines values into a vector or list in the server-side — ds.c • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Concatenates objects into one vector.

    -
    +
    +

    Usage

    ds.c(x = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -66,26 +59,26 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.c returns the vector of concatenating R objects which are written to the server-side.

    -
    -

    Details

    +
    +

    Details

    To avoid combining the character names and not the vectors on the client-side, the names are coerced into a list and the server-side function loops through that list to concatenate the list's elements into a vector.

    Server function called: cDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -124,23 +117,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.c.md b/docs/reference/ds.c.md new file mode 100644 index 00000000..d6149f1a --- /dev/null +++ b/docs/reference/ds.c.md @@ -0,0 +1,88 @@ +# Combines values into a vector or list in the server-side + +Concatenates objects into one vector. + +## Usage + +``` r +ds.c(x = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a vector of character string providing the names of the objects to be + combined. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `c.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.c` returns the vector of concatenating R objects which are written +to the server-side. + +## Details + +To avoid combining the character names and not the vectors on the +client-side, the names are coerced into a list and the server-side +function loops through that list to concatenate the list's elements into +a vector. + +Server function called: `cDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Create a vector with combined objects + myvect <- c("D$LAB_TSC", "D$LAB_HDL") + ds.c(x = myvect, + newobj = "new.vect", + datasources = connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.cbind.html b/docs/reference/ds.cbind.html index 987a131c..9bfd63b5 100644 --- a/docs/reference/ds.cbind.html +++ b/docs/reference/ds.cbind.html @@ -1,51 +1,45 @@ -Combines R objects by columns in the server-side — ds.cbind • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Takes a sequence of vector, matrix or data-frame arguments and combines them by column to produce a data-frame.

    -
    +
    +

    Usage

    ds.cbind(
       x = NULL,
       DataSHIELD.checks = FALSE,
    @@ -56,8 +50,8 @@ 

    Combines R objects by columns in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -95,15 +89,15 @@

    Arguments

    progress. Default FALSE.

    -
    -

    Value

    +
    +

    Value

    ds.cbind returns a data frame combining the columns of the R objects specified in the function which is written to the server-side. It also returns to the client-side two messages with the name of newobj that has been created in each data source and DataSHIELD.checks result.

    -
    -

    Details

    +
    +

    Details

    A sequence of vector, matrix or data-frame arguments is combined column by column to produce a data-frame that is written to the server-side.

    This function is similar to the native R function cbind.

    @@ -119,13 +113,13 @@

    Details

    specified in the x argument and in the same order in all the studies.

    Server function called: cbindDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    
     if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki 
    @@ -198,23 +192,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.cbind.md b/docs/reference/ds.cbind.md new file mode 100644 index 00000000..c086a334 --- /dev/null +++ b/docs/reference/ds.cbind.md @@ -0,0 +1,165 @@ +# Combines R objects by columns in the server-side + +Takes a sequence of vector, matrix or data-frame arguments and combines +them by column to produce a data-frame. + +## Usage + +``` r +ds.cbind( + x = NULL, + DataSHIELD.checks = FALSE, + force.colnames = NULL, + newobj = NULL, + datasources = NULL, + notify.of.progress = FALSE +) +``` + +## Arguments + +- x: + + a character vector with the name of the objects to be combined. + +- DataSHIELD.checks: + + logical. if TRUE does four checks: + 1. the input object(s) is(are) defined in all the studies. + 2. the input object(s) is(are) of the same legal class in all the + studies. + 3. if there are any duplicated column names in the input objects in + each study. + 4. the number of rows is the same in all components to be cbind. + Default FALSE. + +- force.colnames: + + can be NULL (recommended) or a vector of characters that specifies + column names of the output object. If it is not NULL the user should + take some caution. For more information see **Details**. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Defaults `cbind.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default FALSE. + +## Value + +`ds.cbind` returns a data frame combining the columns of the R objects +specified in the function which is written to the server-side. It also +returns to the client-side two messages with the name of `newobj` that +has been created in each data source and `DataSHIELD.checks` result. + +## Details + +A sequence of vector, matrix or data-frame arguments is combined column +by column to produce a data-frame that is written to the server-side. + +This function is similar to the native R function `cbind`. + +In `DataSHIELD.checks` the checks are relatively slow. Default +`DataSHIELD.checks` value is FALSE. + +If `force.colnames` is NULL (which is recommended), the column names are +inferred from the names or column names of the first object specified in +the `x` argument. If this argument is not NULL, then the column names of +the assigned data.frame have the same order as the characters specified +by the user in this argument. Therefore, the vector of `force.colnames` +must have the same number of elements as the columns in the output +object. In a multi-site DataSHIELD setting to use this argument, the +user should make sure that each study has the same number of names and +column names of the input elements specified in the `x` argument and in +the same order in all the studies. + +Server function called: `cbindDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Assign the exponent of a numeric variable at each server and cbind it + # to the data frame D + + ds.exp(x = "D$LAB_HDL", + newobj = "LAB_HDL.exp", + datasources = connections) + + ds.cbind(x = c("D", "LAB_HDL.exp"), + DataSHIELD.checks = FALSE, + newobj = "D.cbind.1", + datasources = connections) + + # Example 2: If there are duplicated column names in the input objects the function adds + # a suffix '.k' to the kth replicate". If also the argument DataSHIELD.checks is set to TRUE + # the function returns a warning message notifying the user for the existence of any duplicated + # column names in each study + + ds.cbind(x = c("LAB_HDL.exp", "LAB_HDL.exp"), + DataSHIELD.checks = TRUE, + newobj = "D.cbind.2", + datasources = connections) + + ds.colnames(x = "D.cbind.2", + datasources = connections) + + # Example 3: Generate a random normally distributed variable of length 100 at each study, + # and cbind it to the data frame D. This example fails and returns an error as the length + # of the generated variable "norm.var" is not the same as the number of rows in the data frame D + + ds.rNorm(samp.size = 100, + newobj = "norm.var", + datasources = connections) + + ds.cbind(x = c("D", "norm.var"), + DataSHIELD.checks = FALSE, + newobj = "D.cbind.3", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } +``` diff --git a/docs/reference/ds.changeRefGroup.html b/docs/reference/ds.changeRefGroup.html index 38ff5e9c..fe23b706 100644 --- a/docs/reference/ds.changeRefGroup.html +++ b/docs/reference/ds.changeRefGroup.html @@ -1,53 +1,48 @@ -Changes the reference level of a factor in the server-side — ds.changeRefGroup • dsBaseClientChanges the reference level of a factor in the server-side — ds.changeRefGroup • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Change the reference level of a factor, by putting the reference group first.

    This function is similar to R function relevel.

    -
    +
    +

    Usage

    ds.changeRefGroup(
       x = NULL,
       ref = NULL,
    @@ -57,8 +52,8 @@ 

    Changes the reference level of a factor in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -86,13 +81,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.changeRefGroup returns a new vector with the specified level as a reference which is written to the server-side.

    -
    -

    Details

    +
    +

    Details

    This function allows the user to re-order the vector, putting the reference group first. It should be mentioned that by default the reference is @@ -103,21 +98,21 @@

    Details

    can render the results of operations on that table invalid.

    Server function called: changeRefGroupDS

    -
    -

    See also

    +
    +

    See also

    ds.cbind Combines objects column-wise.

    ds.levels to obtain the levels (categories) of a vector of type factor.

    ds.colnames to obtain the column names of a matrix or a data frame

    ds.asMatrix to coerce an object into a matrix type.

    ds.dim to obtain the dimensions of a matrix or a data frame.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -191,23 +186,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.changeRefGroup.md b/docs/reference/ds.changeRefGroup.md new file mode 100644 index 00000000..16913931 --- /dev/null +++ b/docs/reference/ds.changeRefGroup.md @@ -0,0 +1,160 @@ +# Changes the reference level of a factor in the server-side + +Change the reference level of a factor, by putting the reference group +first. + +This function is similar to R function `relevel`. + +## Usage + +``` r +ds.changeRefGroup( + x = NULL, + ref = NULL, + newobj = NULL, + reorderByRef = FALSE, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string providing the name of the input vector of type + factor. + +- ref: + + the reference level. + +- newobj: + + a character string that provides the name for the output object that + is stored on the server-side. Default `changerefgroup.newobj`. + +- reorderByRef: + + logical, if TRUE the new vector should be ordered by the reference + group (i.e. putting the reference group first). The default is to not + re-order (see the reasons in the details). + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.changeRefGroup` returns a new vector with the specified level as a +reference which is written to the server-side. + +## Details + +This function allows the user to re-order the vector, putting the +reference group first. It should be mentioned that by default the +reference is the first level in the vector of levels. If the user +chooses the re-order a warning is issued as this can introduce a +mismatch of values if the vector is put back into a table that is not +reordered in the same way. Such mismatch can render the results of +operations on that table invalid. + +Server function called: `changeRefGroupDS` + +## See also + +[`ds.cbind`](ds.cbind.md) Combines objects column-wise. + +[`ds.levels`](ds.levels.md) to obtain the levels (categories) of a +vector of type factor. + +[`ds.colnames`](ds.colnames.md) to obtain the column names of a matrix +or a data frame + +[`ds.asMatrix`](ds.asMatrix.md) to coerce an object into a matrix type. + +[`ds.dim`](ds.dim.md) to obtain the dimensions of a matrix or a data +frame. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Changing the reference group in the server-side + + # Example 1: rename the categories and change the reference with re-ordering + # print out the levels of the initial vector + ds.levels(x= "D$PM_BMI_CATEGORICAL", + datasources = connections) + + # define a vector with the new levels and recode the initial levels + newNames <- c("normal", "overweight", "obesity") + ds.recodeLevels(x = "D$PM_BMI_CATEGORICAL", + newCategories = newNames, + newobj = "bmi_new", + datasources = connections) + + # print out the levels of the new vector + ds.levels(x = "bmi_new", + datasources = connections) + + # Set the reference to "obesity" without changing the order (default) + ds.changeRefGroup(x = "bmi_new", + ref = "obesity", + newobj = "bmi_ob", + datasources = connections) + + # print out the levels; the first listed level (i.e. the reference) is now 'obesity' + ds.levels(x = "bmi_ob", + datasources = connections) + + # Example 2: change the reference and re-order by the reference level + # If re-ordering is sought, the action is completed but a warning is issued + ds.recodeLevels(x = "D$PM_BMI_CATEGORICAL", + newCategories = newNames, + newobj = "bmi_new", + datasources = connections) + ds.changeRefGroup(x = "bmi_new", + ref = "obesity", + newobj = "bmi_ob", + reorderByRef = TRUE, + datasources = connections) + + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.class.html b/docs/reference/ds.class.html index f2aeb12b..7b6d06c9 100644 --- a/docs/reference/ds.class.html +++ b/docs/reference/ds.class.html @@ -1,56 +1,50 @@ -Class of the R object in the server-side — ds.class • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Retrieves the class of an R object. This function is similar to the R function class.

    -
    +
    +

    Usage

    ds.class(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -63,26 +57,27 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.class returns the type of the R object.

    -
    -

    Details

    +
    +

    Details

    Same as the native R function class.

    Server function called: classDS

    -
    -

    See also

    +
    +

    See also

    ds.exists to verify if an object is defined (exists) on the server-side.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -122,23 +117,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.class.md b/docs/reference/ds.class.md new file mode 100644 index 00000000..4c311cd8 --- /dev/null +++ b/docs/reference/ds.class.md @@ -0,0 +1,87 @@ +# Class of the R object in the server-side + +Retrieves the class of an R object. This function is similar to the R +function `class`. + +## Usage + +``` r +ds.class(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of the input R object. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.class` returns the type of the R object. + +## Details + +Same as the native R function `class`. + +Server function called: `classDS` + +## See also + +[`ds.exists`](ds.exists.md) to verify if an object is defined (exists) +on the server-side. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Getting the class of the R objects stored in the server-side + ds.class(x = "D", #whole dataset + datasources = connections[1]) #only the first server ("study1") is used + + ds.class(x = "D$LAB_TSC", #select a variable + datasources = connections[1]) #only the first server ("study1") is used + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.colnames.html b/docs/reference/ds.colnames.html index 196ee293..2baf1713 100644 --- a/docs/reference/ds.colnames.html +++ b/docs/reference/ds.colnames.html @@ -1,56 +1,50 @@ -Produces column names of the R object in the server-side — ds.colnames • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Retrieves column names of an R object on the server-side. This function is similar to R function colnames.

    -
    +
    +

    Usage

    ds.colnames(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -63,27 +57,28 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.colnames returns the column names of the specified server-side data frame or matrix.

    -
    -

    Details

    +
    +

    Details

    The input is restricted to the object of type data.frame or matrix.

    Server function called: colnamesDS

    -
    -

    See also

    +
    +

    See also

    ds.dim to obtain the dimensions of a matrix or a data frame.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -119,23 +114,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.colnames.md b/docs/reference/ds.colnames.md new file mode 100644 index 00000000..ba88d310 --- /dev/null +++ b/docs/reference/ds.colnames.md @@ -0,0 +1,85 @@ +# Produces column names of the R object in the server-side + +Retrieves column names of an R object on the server-side. This function +is similar to R function `colnames`. + +## Usage + +``` r +ds.colnames(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of the input data frame or + matrix. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.colnames` returns the column names of the specified server-side data +frame or matrix. + +## Details + +The input is restricted to the object of type `data.frame` or `matrix`. + +Server function called: `colnamesDS` + +## See also + +[`ds.dim`](ds.dim.md) to obtain the dimensions of a matrix or a data +frame. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Getting column names of the R objects stored in the server-side + ds.colnames(x = "D", + datasources = connections[1]) #only the first server ("study1") is used + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.completeCases.html b/docs/reference/ds.completeCases.html index 13914f3c..6915c60c 100644 --- a/docs/reference/ds.completeCases.html +++ b/docs/reference/ds.completeCases.html @@ -1,56 +1,50 @@ -Identifies complete cases in server-side R objects — ds.completeCases • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Selects complete cases of a data frame, matrix or vector that contain missing values.

    -
    +
    +

    Usage

    ds.completeCases(x1 = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x1
    @@ -71,27 +65,28 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.completeCases generates a modified data frame, matrix or vector from which all rows containing at least one NA have been deleted. The output object is stored on the server-side. Only two validity messages are returned to the client-side indicating the name of the newobj that has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    In the case of a data frame or matrix, ds.completeCases deletes all rows containing one or more missing values. However ds.completeCases in vectors only deletes the observation recorded as NA.

    Server function called: completeCasesDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       # Connecting to the Opal servers
    @@ -139,23 +134,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.completeCases.md b/docs/reference/ds.completeCases.md new file mode 100644 index 00000000..492ddfa6 --- /dev/null +++ b/docs/reference/ds.completeCases.md @@ -0,0 +1,105 @@ +# Identifies complete cases in server-side R objects + +Selects complete cases of a data frame, matrix or vector that contain +missing values. + +## Usage + +``` r +ds.completeCases(x1 = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x1: + + a character denoting the name of the input object which can be a data + frame, matrix or vector. + +- newobj: + + a character string that provides the name for the complete-cases + object that is stored on the data servers. If the user does not + specify a name, then the function generates a name for the generated + object that is the name of the input object with the suffix + "\_complete.cases" + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified, the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.completeCases` generates a modified data frame, matrix or vector +from which all rows containing at least one NA have been deleted. The +output object is stored on the server-side. Only two validity messages +are returned to the client-side indicating the name of the `newobj` that +has been created in each data source and if it is in a valid form. + +## Details + +In the case of a data frame or matrix, `ds.completeCases` deletes all +rows containing one or more missing values. However `ds.completeCases` +in vectors only deletes the observation recorded as NA. + +Server function called: `completeCasesDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Select complete cases from different R objects + + ds.completeCases(x1 = "D", #data frames in the Opal servers + #(see above the connection to the Opal servers) + newobj = "D.completeCases", # name for the output object + # that is stored in the Opal servers + datasources = connections) # All Opal servers are used + # (see above the connection to the Opal servers) + + ds.completeCases(x1 = "D$LAB_TSC", #vector (variable) of the data frames in the Opal servers + #(see above the connection to the Opal servers) + newobj = "LAB_TSC.completeCases", #name for the output variable + #that is stored in the Opal servers + datasources = connections[2]) #only the second Opal server is used ("study2") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } + +``` diff --git a/docs/reference/ds.contourPlot.html b/docs/reference/ds.contourPlot.html index 91e6c727..7d8c2cd3 100644 --- a/docs/reference/ds.contourPlot.html +++ b/docs/reference/ds.contourPlot.html @@ -1,51 +1,45 @@ -Generates a contour plot — ds.contourPlot • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    It generates a contour plot of the pooled data or one plot for each dataset on the client-side.

    -
    +
    +

    Usage

    ds.contourPlot(
       x = NULL,
       y = NULL,
    @@ -59,8 +53,8 @@ 

    Generates a contour plot

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -112,12 +106,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.contourPlot returns a contour plot to the client-side.

    -
    -

    Details

    +
    +

    Details

    The ds.contourPlot function first generates a density grid and uses it to plot the graph. The cells of the grid density matrix that hold a count of less than the filter set by @@ -143,13 +137,13 @@

    Details

    the initial variance of each input variable.

    Server functions called: heatmapPlotDS, rangeDS and densityGridDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -195,23 +189,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.contourPlot.md b/docs/reference/ds.contourPlot.md new file mode 100644 index 00000000..71f9a35f --- /dev/null +++ b/docs/reference/ds.contourPlot.md @@ -0,0 +1,165 @@ +# Generates a contour plot + +It generates a contour plot of the pooled data or one plot for each +dataset on the client-side. + +## Usage + +``` r +ds.contourPlot( + x = NULL, + y = NULL, + type = "combine", + show = "all", + numints = 20, + method = "smallCellsRule", + k = 3, + noise = 0.25, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string providing the name of a numerical vector. + +- y: + + a character string providing the name of a numerical vector. + +- type: + + a character string that represents the type of graph to display. If + `type` is set to `'combine'`, a combined contour plot displayed and if + `type` is set to `'split'`, each contour is plotted separately. + +- show: + + a character that represents where the plot should focus. If `show` is + set to `'all'`, the ranges of the variables are used as plot limits. + If `show` is set to `'zoomed'`, the plot is zoomed to the region where + the actual data are. + +- numints: + + number of intervals for a density grid object. + +- method: + + a character that defines which contour will be created. If `method` is + set to `'smallCellsRule'` (default), the contour plot of the actual + variables is created but grids with low counts are replaced with grids + with zero counts. If `method` is set to `'deterministic'` the contour + of the scaled centroids of each k nearest neighbour of the original + variables is created, where the value of `k` is set by the user. If + the `method` is set to `'probabilistic'`, then the contour of 'noisy' + variables is generated. + +- k: + + the number of the nearest neighbours for which their centroid is + calculated. For more information see details. + +- noise: + + the percentage of the initial variance that is used as the variance of + the embedded noise if the argument `method` is set to + `'probabilistic'`. For more information see details. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.contourPlot` returns a contour plot to the client-side. + +## Details + +The `ds.contourPlot` function first generates a density grid and uses it +to plot the graph. The cells of the grid density matrix that hold a +count of less than the filter set by DataSHIELD (usually 5) are +considered invalid and turned into 0 to avoid potential disclosure. A +message is printed to inform the user about the number of invalid cells. + +The ranges returned by each study and used in the process of getting the +grid density matrix are not the exact minimum and maximum values but +rather close approximates of the real minimum and maximum value. This +was done to reduce the risk of potential disclosure. + +In the `k` parameter the user can choose any value for `k` equal to or +greater than the pre-specified threshold used as a disclosure control +for this method and lower than the number of observations minus the +value of this threshold. `k` default value is 3 (we suggest k to be +equal to, or bigger than, 3). Note that the function fails if the user +uses the default value but the study has set a bigger threshold. The +value of `k` is used only if the argument `method` is set to +`'deterministic'`. Any value of k is ignored if the argument `method` is +set to `'probabilistic'` or `'smallCellsRule'`. + +In `noise` any value of noise is ignored if the argument `method` is set +to `'deterministic'` or `'smallCellsRule'`. The user can choose any +value for noise equal to or greater than the pre-specified threshold +`'nfilter.noise'`. Default noise value is 0.25. The added noise follows +a normal distribution with zero mean and variance equal to a percentage +of the initial variance of each input variable. + +Server functions called: `heatmapPlotDS`, `rangeDS` and `densityGridDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Generating contour plots + + ds.contourPlot(x = "D$LAB_TSC", + y = "D$LAB_HDL", + type = "combine", + show = "all", + numints = 20, + method = "smallCellsRule", + k = 3, + noise = 0.25, + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.cor.html b/docs/reference/ds.cor.html index 3b7a100b..c8e2de06 100644 --- a/docs/reference/ds.cor.html +++ b/docs/reference/ds.cor.html @@ -1,56 +1,56 @@ -Calculates the correlation of R objects in the server-side — ds.cor • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the correlation of two variables or the correlation matrix for the variables of an input data frame.

    -
    -
    ds.cor(x = NULL, y = NULL, type = "split", datasources = NULL)
    +
    +

    Usage

    +
    ds.cor(
    +  x = NULL,
    +  y = NULL,
    +  type = "split",
    +  datasources = NULL,
    +  classConsistencyCheck = TRUE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -72,9 +72,14 @@

    Arguments

    If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.cor returns a list containing the number of missing values in each variable, the number of missing variables casewise, the correlation matrix, the number of used complete cases. The function applies two disclosure controls. The first disclosure @@ -82,8 +87,8 @@

    Value

    percentage is pre-specified by the 'nfilter.glm'). The second disclosure control checks that none of them is dichotomous with a level having fewer counts than the pre-specified 'nfilter.tab' threshold.

    -
    -

    Details

    +
    +

    Details

    In addition to computing correlations; this function produces a table outlining the number of complete cases and a table outlining the number of missing values to allow the user to decide the 'relevance' of the correlation based on the number of complete @@ -100,13 +105,14 @@

    Details

    from all the involved studies, are returned.

    Server function called: corDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
     ## Version 6, for version 5 see the Wiki
    @@ -148,23 +154,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.cor.md b/docs/reference/ds.cor.md new file mode 100644 index 00000000..a7fbf22b --- /dev/null +++ b/docs/reference/ds.cor.md @@ -0,0 +1,134 @@ +# Calculates the correlation of R objects in the server-side + +This function calculates the correlation of two variables or the +correlation matrix for the variables of an input data frame. + +## Usage + +``` r +ds.cor( + x = NULL, + y = NULL, + type = "split", + datasources = NULL, + classConsistencyCheck = TRUE +) +``` + +## Arguments + +- x: + + a character string providing the name of the input vector, data frame + or matrix. + +- y: + + a character string providing the name of the input vector, data frame + or matrix. Default NULL. + +- type: + + a character string that represents the type of analysis to carry out. + This must be set to `'split'` or `'combine'`. Default `'split'`. For + more information see details. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.cor` returns a list containing the number of missing values in each +variable, the number of missing variables casewise, the correlation +matrix, the number of used complete cases. The function applies two +disclosure controls. The first disclosure control checks that the number +of variables is not bigger than a percentage of the individual-level +records (the allowed percentage is pre-specified by the 'nfilter.glm'). +The second disclosure control checks that none of them is dichotomous +with a level having fewer counts than the pre-specified 'nfilter.tab' +threshold. + +## Details + +In addition to computing correlations; this function produces a table +outlining the number of complete cases and a table outlining the number +of missing values to allow the user to decide the 'relevance' of the +correlation based on the number of complete cases included in the +correlation calculations. + +If the argument `y` is not NULL, the dimensions of the object have to be +compatible with the argument `x`. + +The function calculates the pairwise correlations based on casewise +complete cases which means that it omits all the rows in the input data +frame that include at least one cell with a missing value, before the +calculation of correlations. + +If `type` is set to `'split'` (default), the correlation of two +variables or the variance-correlation matrix of an input data frame and +the number of complete cases and missing values are returned for every +single study. If type is set to `'combine'`, the pooled correlation, the +total number of complete cases and the total number of missing values +aggregated from all the involved studies, are returned. + +Server function called: `corDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + +## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Get the correlation matrix of two continuous variables + ds.cor(x="D$LAB_TSC", y="D$LAB_TRIG", type="combine", datasources = connections) + + # Example 2: Get the correlation matrix of the variables in a dataframe + ds.dataFrame(x=c("D$LAB_TSC", "D$LAB_TRIG", "D$LAB_HDL", "D$PM_BMI_CONTINUOUS"), + newobj="D.new", check.names=FALSE, datasources=connections) + ds.cor("D.new", type="combine", datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.corTest.html b/docs/reference/ds.corTest.html index 1bf393c8..485ada2b 100644 --- a/docs/reference/ds.corTest.html +++ b/docs/reference/ds.corTest.html @@ -1,49 +1,42 @@ -Tests for correlation between paired samples in the server-side — ds.corTest • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is similar to the R stats function cor.test.

    -
    +
    +

    Usage

    ds.corTest(
       x = NULL,
       y = NULL,
    @@ -51,12 +44,13 @@ 

    Tests for correlation between paired samples in the server-side

    exact = NULL, conf.level = 0.95, type = "split", - datasources = NULL + datasources = NULL, + classConsistencyCheck = FALSE )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -97,24 +91,30 @@

    Arguments

    objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default FALSE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.corTest returns to the client-side the results of the correlation test.

    -
    -

    Details

    +
    +

    Details

    Runs a two-sided correlation test between paired samples, using one of Pearson's product moment correlation coefficient, Kendall's tau or Spearman's rho. Server function called: corTestDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -154,23 +154,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.corTest.md b/docs/reference/ds.corTest.md new file mode 100644 index 00000000..78d974ac --- /dev/null +++ b/docs/reference/ds.corTest.md @@ -0,0 +1,124 @@ +# Tests for correlation between paired samples in the server-side + +This is similar to the R stats function `cor.test`. + +## Usage + +``` r +ds.corTest( + x = NULL, + y = NULL, + method = "pearson", + exact = NULL, + conf.level = 0.95, + type = "split", + datasources = NULL, + classConsistencyCheck = FALSE +) +``` + +## Arguments + +- x: + + a character string providing the name of a numerical vector. + +- y: + + a character string providing the name of a numerical vector. + +- method: + + a character string indicating which correlation coefficient is to be + used for the test. One of "pearson", "kendall", or "spearman", can be + abbreviated. Default is set to "pearson". + +- exact: + + a logical indicating whether an exact p-value should be computed. Used + for Kendall's tau and Spearman's rho. See *Details* of R stats + function `cor.test` for the meaning of NULL (the default). + +- conf.level: + + confidence level for the returned confidence interval. Currently only + used for the Pearson product moment correlation coefficient if there + are at least 4 complete pairs of observations. Default is set to 0.95. + +- type: + + a character string that represents the type of analysis to carry out. + This must be set to `'split'` or `'combine'`. Default is set to + `'split'`. If `type` is set to "combine" then an approximated pooled + correlation is estimated based on Fisher's z transformation. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default FALSE. + +## Value + +`ds.corTest` returns to the client-side the results of the correlation +test. + +## Details + +Runs a two-sided correlation test between paired samples, using one of +Pearson's product moment correlation coefficient, Kendall's tau or +Spearman's rho. Server function called: `corTestDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # test for correlation + ds.corTest(x = "D$LAB_TSC", + y = "D$LAB_HDL", + datasources = connections[1]) #Only first server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.cov.html b/docs/reference/ds.cov.html index dec6c58f..c97f3994 100644 --- a/docs/reference/ds.cov.html +++ b/docs/reference/ds.cov.html @@ -1,62 +1,57 @@ -Calculates the covariance of R objects in the server-side — ds.cov • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the covariance of two variables or the variance-covariance matrix for the variables of an input data frame.

    -
    +
    +

    Usage

    ds.cov(
       x = NULL,
       y = NULL,
       naAction = "pairwise.complete",
       type = "split",
    -  datasources = NULL
    +  datasources = NULL,
    +  classConsistencyCheck = TRUE
     )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -84,9 +79,14 @@

    Arguments

    If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.cov returns a list containing the number of missing values in each variable, the number of missing values casewise or pairwise depending on the argument naAction, the covariance matrix, the number of used complete cases and an error message which indicates whether or not the input variables pass the disclosure controls. The first disclosure @@ -96,8 +96,8 @@

    Value

    the disclosure controls then all the output values are replaced with NAs. If all the variables are valid and pass the controls, then the output matrices are returned and also an error message is returned but it is replaced by NA.

    -
    -

    Details

    +
    +

    Details

    In addition to computing covariances; this function produces a table outlining the number of complete cases and a table outlining the number of missing values to allow for the user to decide about the 'relevance' of the covariance based on the number of complete @@ -118,13 +118,14 @@

    Details

    and the total number of missing values aggregated from all the involved studies, are returned.

    Server function called: covDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
     ## Version 6, for version 5 see the Wiki
    @@ -173,23 +174,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.cov.md b/docs/reference/ds.cov.md new file mode 100644 index 00000000..da5be222 --- /dev/null +++ b/docs/reference/ds.cov.md @@ -0,0 +1,158 @@ +# Calculates the covariance of R objects in the server-side + +This function calculates the covariance of two variables or the +variance-covariance matrix for the variables of an input data frame. + +## Usage + +``` r +ds.cov( + x = NULL, + y = NULL, + naAction = "pairwise.complete", + type = "split", + datasources = NULL, + classConsistencyCheck = TRUE +) +``` + +## Arguments + +- x: + + a character string providing the name of the input vector, data frame + or matrix. + +- y: + + a character string providing the name of the input vector, data frame + or matrix. Default NULL. + +- naAction: + + a character string giving a method for computing covariances in the + presence of missing values. This must be set to `'casewise.complete'` + or `'pairwise.complete'`. Default `'pairwise.complete'`. For more + information see details. + +- type: + + a character string that represents the type of analysis to carry out. + This must be set to `'split'` or `'combine'`. Default `'split'`. For + more information see details. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.cov` returns a list containing the number of missing values in each +variable, the number of missing values casewise or pairwise depending on +the argument `naAction`, the covariance matrix, the number of used +complete cases and an error message which indicates whether or not the +input variables pass the disclosure controls. The first disclosure +control checks that the number of variables is not bigger than a +percentage of the individual-level records (the allowed percentage is +pre-specified by the 'nfilter.glm'). The second disclosure control +checks that none of them is dichotomous with a level having fewer counts +than the pre-specified 'nfilter.tab' threshold. If any of the input +variables do not pass the disclosure controls then all the output values +are replaced with NAs. If all the variables are valid and pass the +controls, then the output matrices are returned and also an error +message is returned but it is replaced by NA. + +## Details + +In addition to computing covariances; this function produces a table +outlining the number of complete cases and a table outlining the number +of missing values to allow for the user to decide about the 'relevance' +of the covariance based on the number of complete cases included in the +covariance calculations. + +If the argument `y` is not NULL, the dimensions of the object have to be +compatible with the argument `x`. + +If `naAction` is set to `'casewise.complete'`, then the function omits +all the rows in the whole data frame that include at least one cell with +a missing value before the calculation of covariances. If `naAction` is +set to `'pairwise.complete'` (default), then the function divides the +input data frame to subset data frames formed by each pair between two +variables (all combinations are considered) and omits the rows with +missing values at each pair separately and then calculates the +covariances of those pairs. + +If `type` is set to `'split'` (default), the covariance of two variables +or the variance-covariance matrix of an input data frame and the number +of complete cases and missing values are returned for every single +study. If type is set to `'combine'`, the pooled covariance, the total +number of complete cases and the total number of missing values +aggregated from all the involved studies, are returned. + +Server function called: `covDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + +## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Calculate the covariance between two vectors + ds.assign(newobj='labhdl', toAssign='D$LAB_HDL', datasources = connections) + ds.assign(newobj='labtsc', toAssign='D$LAB_TSC', datasources = connections) + ds.assign(newobj='gender', toAssign='D$GENDER', datasources = connections) + ds.cov(x = 'labhdl', + y = 'labtsc', + naAction = 'pairwise.complete', + type = 'combine', + datasources = connections) + ds.cov(x = 'labhdl', + y = 'gender', + naAction = 'pairwise.complete', + type = 'combine', + datasources = connections[1]) #only the first Opal server is used ("study1") + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.dataFrame.html b/docs/reference/ds.dataFrame.html index 9a7790b5..60f27911 100644 --- a/docs/reference/ds.dataFrame.html +++ b/docs/reference/ds.dataFrame.html @@ -1,51 +1,45 @@ -Generates a data frame object in the server-side — ds.dataFrame • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Creates a data frame from its elemental components: pre-existing data frames, single variables or matrices.

    -
    +
    +

    Usage

    ds.dataFrame(
       x = NULL,
       row.names = NULL,
    @@ -60,8 +54,8 @@ 

    Generates a data frame object in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -121,15 +115,15 @@

    Arguments

    progress. Default is FALSE.

    -
    -

    Value

    +
    +

    Value

    ds.dataFrame returns the object specified by the newobj argument which is written to the serverside. Also, two validity messages are returned to the client-side indicating the name of the newobj that has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    It creates a data frame by combining pre-existing data frames, matrices or variables.

    The length of all component variables and the number of rows @@ -137,13 +131,13 @@

    Details

    data frame will have the same number of rows.

    Server functions called: classDS, colnamesDS, dataFrameDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    
     if (FALSE) { # \dontrun{
     
    @@ -191,23 +185,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.dataFrame.md b/docs/reference/ds.dataFrame.md new file mode 100644 index 00000000..e314cf6f --- /dev/null +++ b/docs/reference/ds.dataFrame.md @@ -0,0 +1,154 @@ +# Generates a data frame object in the server-side + +Creates a data frame from its elemental components: pre-existing data +frames, single variables or matrices. + +## Usage + +``` r +ds.dataFrame( + x = NULL, + row.names = NULL, + check.rows = FALSE, + check.names = TRUE, + stringsAsFactors = TRUE, + completeCases = FALSE, + DataSHIELD.checks = FALSE, + newobj = NULL, + datasources = NULL, + notify.of.progress = FALSE +) +``` + +## Arguments + +- x: + + a character string that provides the name of the objects to be + combined. + +- row.names: + + NULL, integer or character string that provides the row names of the + output data frame. + +- check.rows: + + logical. If TRUE then the rows are checked for consistency of length + and names. Default is FALSE. + +- check.names: + + logical. If TRUE the column names in the data frame are checked to + ensure that is unique. Default is TRUE. + +- stringsAsFactors: + + logical. If true the character vectors are converted to factors. + Default TRUE. + +- completeCases: + + logical. If TRUE rows with one or more missing values will be deleted + from the output data frame. Default is FALSE. + +- DataSHIELD.checks: + + logical. Default FALSE. If TRUE undertakes all DataSHIELD checks + (time-consuming) which are: + 1. the input object(s) is(are) defined in all the studies + 2. the input object(s) is(are) of the same legal class in all the + studies + 3. if there are any duplicated column names in the input objects in + each study + 4. the number of rows of the data frames or matrices and the length of + all component variables are the same + +- newobj: + + a character string that provides the name for the output data frame + that is stored on the data servers. Default `dataframe.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default is FALSE. + +## Value + +`ds.dataFrame` returns the object specified by the `newobj` argument +which is written to the serverside. Also, two validity messages are +returned to the client-side indicating the name of the `newobj` that has +been created in each data source and if it is in a valid form. + +## Details + +It creates a data frame by combining pre-existing data frames, matrices +or variables. + +The length of all component variables and the number of rows of the data +frames or matrices must be the same. The output data frame will have the +same number of rows. + +Server functions called: `classDS`, `colnamesDS`, `dataFrameDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Create a new data frame + ds.dataFrame(x = c("D$LAB_TSC","D$GENDER","D$PM_BMI_CATEGORICAL"), + row.names = NULL, + check.rows = FALSE, + check.names = TRUE, + stringsAsFactors = TRUE, #character variables are converted to a factor + completeCases = TRUE, #only rows with not missing values are selected + DataSHIELD.checks = FALSE, + newobj = "df1", + datasources = connections[1], #only the first Opal server is used ("study1") + notify.of.progress = FALSE) + + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.dataFrameFill.html b/docs/reference/ds.dataFrameFill.html index b64d23b3..26091eec 100644 --- a/docs/reference/ds.dataFrameFill.html +++ b/docs/reference/ds.dataFrameFill.html @@ -1,54 +1,47 @@ -Creates missing values columns in the server-side — ds.dataFrameFill • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Adds extra columns with missing values in a data frame on the server-side.

    -
    +
    +

    Usage

    ds.dataFrameFill(df.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    df.name
    @@ -67,15 +60,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.dataFrameFill returns the object specified by the newobj argument which is written to the server-side. Also, two validity messages are returned to the client-side indicating the name of the newobj that has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function checks if the input data frames have the same variables (i.e. the same column names) in all of the used studies. When a study does not have some of the variables, the function generates those variables as vectors of missing values and combines them as columns to @@ -84,13 +77,14 @@

    Details

    factors exist.

    Server function called: dataFrameFillDS

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki 
    @@ -142,23 +136,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.dataFrameFill.md b/docs/reference/ds.dataFrameFill.md new file mode 100644 index 00000000..7faf6505 --- /dev/null +++ b/docs/reference/ds.dataFrameFill.md @@ -0,0 +1,110 @@ +# Creates missing values columns in the server-side + +Adds extra columns with missing values in a data frame on the +server-side. + +## Usage + +``` r +ds.dataFrameFill(df.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- df.name: + + a character string representing the name of the input data frame that + will be filled with extra columns of missing values. + +- newobj: + + a character string that provides the name for the output data frame + that is stored on the data servers. Default value is + "dataframefill.newobj". + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.dataFrameFill` returns the object specified by the `newobj` argument +which is written to the server-side. Also, two validity messages are +returned to the client-side indicating the name of the `newobj` that has +been created in each data source and if it is in a valid form. + +## Details + +This function checks if the input data frames have the same variables +(i.e. the same column names) in all of the used studies. When a study +does not have some of the variables, the function generates those +variables as vectors of missing values and combines them as columns to +the input data frame. If any of the generated variables are of class +factor, the function assigns to those the corresponding levels of the +factors given from the studies where such factors exist. + +Server function called: `dataFrameFillDS` + +## Author + +Demetris Avraam for DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Create two data frames with one different column + + ds.dataFrame(x = c("D$LAB_TSC","D$LAB_TRIG","D$LAB_HDL", + "D$LAB_GLUC_ADJUSTED","D$PM_BMI_CONTINUOUS"), + newobj = "df1", + datasources = connections[1]) + + ds.dataFrame(x = c("D$LAB_TSC","D$LAB_TRIG","D$LAB_HDL","D$LAB_GLUC_ADJUSTED"), + newobj = "df1", + datasources = connections[2]) + + # Fill the data frame with NA columns + + ds.dataFrameFill(df.name = "df1", + newobj = "D.Fill", + datasources = connections[c(1,2)]) # Two servers are used + + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.dataFrameSort.html b/docs/reference/ds.dataFrameSort.html index 0fad3dd8..8cd06423 100644 --- a/docs/reference/ds.dataFrameSort.html +++ b/docs/reference/ds.dataFrameSort.html @@ -1,49 +1,42 @@ -Sorts data frames in the server-side — ds.dataFrameSort • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Sorts a data frame using a specified sort key.

    -
    +
    +

    Usage

    ds.dataFrameSort(
       df.name = NULL,
       sort.key.name = NULL,
    @@ -54,8 +47,8 @@ 

    Sorts data frames in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    df.name
    @@ -90,16 +83,16 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.dataFrameSort returns the sorted data frame is written to the server-side. Also, two validity messages are returned to the client-side indicating the name of the newobj which has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    It sorts a specified data.frame on the serverside using a sort key also on the server-side. The sort key can either sit in the data.frame or outside it. @@ -116,13 +109,13 @@

    Details

    alphabetic.sort = (-112, -192, -231, -9, 101, 112, 119, 147, 163, 1670, 76, 841, NA, NA)

    Server function called: dataFrameSortDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -163,23 +156,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.dataFrameSort.md b/docs/reference/ds.dataFrameSort.md new file mode 100644 index 00000000..132a9c68 --- /dev/null +++ b/docs/reference/ds.dataFrameSort.md @@ -0,0 +1,132 @@ +# Sorts data frames in the server-side + +Sorts a data frame using a specified sort key. + +## Usage + +``` r +ds.dataFrameSort( + df.name = NULL, + sort.key.name = NULL, + sort.descending = FALSE, + sort.method = "default", + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- df.name: + + a character string providing the name of the data frame to be sorted. + +- sort.key.name: + + a character string providing the name for the sort key. + +- sort.descending: + + logical, if TRUE the data frame will be sorted. by the sort key in + descending order. Default = FALSE (sort order ascending). + +- sort.method: + + a character string that specifies the method to be used to sort the + data frame. This can be set as `"alphabetic"`,`"a"` or `"numeric"`, + `"n"`. + +- newobj: + + a character string that provides the name for the output data frame + that is stored on the data servers. Default `dataframesort.newobj`. + where `df.name` is the first argument of `ds.dataFrameSort()`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.dataFrameSort` returns the sorted data frame is written to the +server-side. Also, two validity messages are returned to the client-side +indicating the name of the `newobj` which has been created in each data +source and if it is in a valid form. + +## Details + +It sorts a specified data.frame on the serverside using a sort key also +on the server-side. The sort key can either sit in the data.frame or +outside it. The sort key can be forced to be interpreted as alphabetic +or numeric. + +When a numeric vector is sorted alphabetically, the order can look +confusing. For example, if we have a numeric vector to sort: +vector.2.sort = c(-192, 76, 841, NA, 1670, 163, 147, 101, -112, -231, +-9, 119, 112, NA) + +When sorting numbers in an ascending (default) manner, the largest +negative numbers get ordered first leading up to the largest positive +numbers and finally (by default in R) NAs being positioned at the end of +the vector: +numeric.sort = c(-231, -192, -112, -9, 76, 101, 112, 119, 147, 163, 841, +1670, NA, NA) + +Instead, if the same vector is sorted alphabetically the the resultant +vector is: + +alphabetic.sort = (-112, -192, -231, -9, 101, 112, 119, 147, 163, 1670, +76, 841, NA, NA) + +Server function called: `dataFrameSortDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Sorting the data frame + ds.dataFrameSort(df.name = "D", + sort.key.name = "D$LAB_TSC", + sort.descending = TRUE, + sort.method = "numeric", + newobj = "df.sort", + datasources = connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.dataFrameSubset.html b/docs/reference/ds.dataFrameSubset.html index eb8a1f3a..3b626bc1 100644 --- a/docs/reference/ds.dataFrameSubset.html +++ b/docs/reference/ds.dataFrameSubset.html @@ -1,49 +1,42 @@ -Sub-sets data frames in the server-side — ds.dataFrameSubset • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Subsets a data frame by rows and/or by columns.

    -
    +
    +

    Usage

    ds.dataFrameSubset(
       df.name = NULL,
       V1.name = NULL,
    @@ -58,8 +51,8 @@ 

    Sub-sets data frames in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    df.name
    @@ -113,8 +106,8 @@

    Arguments

    progress. Default FALSE.

    -
    -

    Value

    +
    +

    Value

    ds.dataFrameSubset returns the object specified by the newobj argument which is written to the server-side. @@ -122,8 +115,8 @@

    Value

    the name of the newobj which has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    Subset a pre-existing data frame using the standard set of Boolean operators (==, !=, >, >=, <, <=). The subsetting is made by rows, but it is also possible to select @@ -135,13 +128,13 @@

    Details

    there are no missing values. For more information see the example 2 below.

    Server functions called: dataFrameSubsetDS1 and dataFrameSubsetDS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -208,23 +201,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.dataFrameSubset.md b/docs/reference/ds.dataFrameSubset.md new file mode 100644 index 00000000..562ae22b --- /dev/null +++ b/docs/reference/ds.dataFrameSubset.md @@ -0,0 +1,171 @@ +# Sub-sets data frames in the server-side + +Subsets a data frame by rows and/or by columns. + +## Usage + +``` r +ds.dataFrameSubset( + df.name = NULL, + V1.name = NULL, + V2.name = NULL, + Boolean.operator = NULL, + keep.cols = NULL, + rm.cols = NULL, + keep.NAs = NULL, + newobj = NULL, + datasources = NULL, + notify.of.progress = FALSE +) +``` + +## Arguments + +- df.name: + + a character string providing the name of the data frame to be subset. + +- V1.name: + + A character string specifying the name of the vector to which the + Boolean operator is to be applied to define the subset. For more + information see details. + +- V2.name: + + A character string specifying the name of the vector to compare with + `V1.name`. + +- Boolean.operator: + + A character string specifying one of six possible Boolean operators: + `'==', '!=', '>', '>=', '<'` and `'<='`. + +- keep.cols: + + a numeric vector specifying the numbers of the columns to be kept in + the final subset. + +- rm.cols: + + a numeric vector specifying the numbers of the columns to be removed + from the final subset. + +- keep.NAs: + + logical, if TRUE the missing values are included in the subset. If + FALSE or NULL all rows with at least one missing values are removed + from the subset. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `dataframesubset.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` the default set of + connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default FALSE. + +## Value + +`ds.dataFrameSubset` returns the object specified by the `newobj` +argument which is written to the server-side. Also, two validity +messages are returned to the client-side indicating the name of the +`newobj` which has been created in each data source and if it is in a +valid form. + +## Details + +Subset a pre-existing data frame using the standard set of Boolean +operators (`==, !=, >, >=, <, <=`). The subsetting is made by rows, but +it is also possible to select columns to keep or remove. Instead, if you +wish to keep all rows in the subset (e.g. if the primary plan is to +subset by columns and not by rows) the `V1.name` and `V2.name` +parameters can be used to specify a vector of the same length as the +data frame to be subsetted in each study in which every element is 1 and +there are no missing values. For more information see the example 2 +below. + +Server functions called: `dataFrameSubsetDS1` and `dataFrameSubsetDS2` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Subsetting a data frame + #Example 1: Include some rows and all columns in the subset + ds.dataFrameSubset(df.name = "D", + V1.name = "D$LAB_TSC", + V2.name = "D$LAB_TRIG", + Boolean.operator = ">", + keep.cols = NULL, #All columns are included in the new subset + rm.cols = NULL, #All columns are included in the new subset + keep.NAs = FALSE, #All rows with NAs are removed + newobj = "new.subset", + datasources = connections[1],#only the first server is used ("study1") + notify.of.progress = FALSE) + #Example 2: Include all rows and some columns in the new subset + #Select complete cases (rows without NA) + ds.completeCases(x1 = "D", + newobj = "complet", + datasources = connections) + #Create a vector with all ones + ds.make(toAssign = "complet$LAB_TSC-complet$LAB_TSC+1", + newobj = "ONES", + datasources = connections) + #Subset the data + ds.dataFrameSubset(df.name = "complet", + V1.name = "ONES", + V2.name = "ONES", + Boolean.operator = "==", + keep.cols = c(1:4,10), #only columns 1, 2, 3, 4 and 10 are selected + rm.cols = NULL, + keep.NAs = FALSE, + newobj = "subset.all.rows", + datasources = connections, #all servers are used + notify.of.progress = FALSE) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.densityGrid.html b/docs/reference/ds.densityGrid.html index 4055ac5d..6d01db63 100644 --- a/docs/reference/ds.densityGrid.html +++ b/docs/reference/ds.densityGrid.html @@ -1,51 +1,45 @@ -Generates a density grid in the client-side — ds.densityGrid • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function generates a grid density object which can then be used to produced heatmap or contour plots.

    -
    +
    +

    Usage

    ds.densityGrid(
       x = NULL,
       y = NULL,
    @@ -55,8 +49,8 @@ 

    Generates a density grid in the client-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -86,12 +80,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.densityGrid returns a grid density matrix.

    -
    -

    Details

    +
    +

    Details

    The cells with a count > 0 and < nfilter.tab are considered invalid and the count is set to 0.

    In DataSHIELD the user does not have access to the micro-data so and extreme values @@ -103,32 +97,28 @@

    Details

    (i.e. values that do not lead to leakage of micro-data to the user).

    Server function called: densityGridDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.densityGrid.md b/docs/reference/ds.densityGrid.md new file mode 100644 index 00000000..32a68fc5 --- /dev/null +++ b/docs/reference/ds.densityGrid.md @@ -0,0 +1,71 @@ +# Generates a density grid in the client-side + +This function generates a grid density object which can then be used to +produced heatmap or contour plots. + +## Usage + +``` r +ds.densityGrid( + x = NULL, + y = NULL, + numints = 20, + type = "combine", + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string providing the name of the input numerical vector. + +- y: + + a character string providing the name of the input numerical vector. + +- numints: + + an integer, the number of intervals for the grid density object. The + default value is 20. + +- type: + + a character string that represents the type of graph to display. If + `type` is set to `'combine'`, a pooled grid density matrix is + generated, instead if `type` is set to `'split'` one grid density + matrix is generated. Default `'combine'`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.densityGrid` returns a grid density matrix. + +## Details + +The cells with a count \> 0 and \< nfilter.tab are considered invalid +and the count is set to 0. + +In DataSHIELD the user does not have access to the micro-data so and +extreme values such as the maximum and the minimum are potentially +non-disclosive so this function does not allow for the user to set the +limits of the density grid and the minimum and maximum values of the `x` +and `y` vectors. These elements are set by the server-side function +`densityGridDS` to 'valid' values (i.e. values that do not lead to +leakage of micro-data to the user). + +Server function called: `densityGridDS` + +## Author + +DataSHIELD Development Team + +## Examples diff --git a/docs/reference/ds.dim.html b/docs/reference/ds.dim.html index 4805c721..989c68fe 100644 --- a/docs/reference/ds.dim.html +++ b/docs/reference/ds.dim.html @@ -1,56 +1,55 @@ -Retrieves the dimension of a server-side R object — ds.dim • dsBaseClient - - -
    -
    +
    +
    +
    -
    - -
    +

    Gives the dimensions of an R object on the server-side. This function is similar to R function dim.

    -
    -
    ds.dim(x = NULL, type = "both", checks = FALSE, datasources = NULL)
    +
    +

    Usage

    +
    ds.dim(
    +  x = NULL,
    +  type = "both",
    +  datasources = NULL,
    +  classConsistencyCheck = TRUE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -67,115 +66,62 @@

    Arguments

    Default 'both'.

    -
    checks
    -

    logical. If TRUE undertakes all DataSHIELD checks (time-consuming). -Default FALSE.

    - -
    datasources

    a list of DSConnection-class objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.dim retrieves to the client-side the dimension of the object in the form of a vector where the first element indicates the number of rows and the second element indicates the number of columns.

    -
    -

    Details

    +
    +

    Details

    The function returns the dimension of the server-side input object (e.g. array, matrix or data frame) from every single study and the pooled dimension of the object by summing up the individual dimensions returned from each study.

    -

    In checks parameter is suggested that checks should only be undertaken once the -function call has failed.

    Server function called: dimDS

    -
    -

    See also

    +
    +

    See also

    ds.dataFrame to generate a table of the type data frame.

    ds.changeRefGroup to change the reference level of a factor.

    ds.colnames to obtain the column names of a matrix or a data frame

    ds.asMatrix to coerce an object into a matrix type.

    ds.length to obtain the size of a vector.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    -
    if (FALSE) { # \dontrun{
    -
    -  ## Version 6, for version 5 see the Wiki
    -  
    -  # connecting to the Opal servers
    -
    -  require('DSI')
    -  require('DSOpal')
    -  require('dsBaseClient')
    -
    -  builder <- DSI::newDSLoginBuilder()
    -  builder$append(server = "study1", 
    -                 url = "http://192.168.56.100:8080/", 
    -                 user = "administrator", password = "datashield_test&", 
    -                 table = "CNSIM.CNSIM1", driver = "OpalDriver")
    -  builder$append(server = "study2", 
    -                 url = "http://192.168.56.100:8080/", 
    -                 user = "administrator", password = "datashield_test&", 
    -                 table = "CNSIM.CNSIM2", driver = "OpalDriver")
    -  builder$append(server = "study3",
    -                 url = "http://192.168.56.100:8080/", 
    -                 user = "administrator", password = "datashield_test&", 
    -                 table = "CNSIM.CNSIM3", driver = "OpalDriver")
    -  logindata <- builder$build()
    -  
    -  connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") 
    -  
    -
    -  # Calculate the dimension
    -  ds.dim(x="D", 
    -         type="combine", #global dimension
    -         checks = FALSE,
    -         datasources = connections)#all opal servers are used
    -  ds.dim(x="D",
    -         type = "both",#separate dimension for each study
    -                       #and the pooled dimension (default) 
    -         checks = FALSE,
    -         datasources = connections)#all opal servers are used
    -  ds.dim(x="D", 
    -         type="split", #separate dimension for each study
    -         checks = FALSE,
    -         datasources = connections[1])#only the first opal server is used ("study1")
    -
    -  # clear the Datashield R sessions and logout
    -  datashield.logout(connections)
    -
    -} # }
    -
    -
    +
    +

    Examples

    +
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.dim.md b/docs/reference/ds.dim.md new file mode 100644 index 00000000..ba92e8f6 --- /dev/null +++ b/docs/reference/ds.dim.md @@ -0,0 +1,81 @@ +# Retrieves the dimension of a server-side R object + +Gives the dimensions of an R object on the server-side. This function is +similar to R function `dim`. + +## Usage + +``` r +ds.dim( + x = NULL, + type = "both", + datasources = NULL, + classConsistencyCheck = TRUE +) +``` + +## Arguments + +- x: + + a character string providing the name of the input object. + +- type: + + a character string that represents the type of analysis to carry out. + If `type` is set to `'combine'`, `'combined'`, `'combines'` or `'c'`, + the global dimension is returned. If `type` is set to `'split'`, + `'splits'` or `'s'`, the dimension is returned separately for each + study. If `type` is set to `'both'` or `'b'`, both sets of outputs are + produced. Default `'both'`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.dim` retrieves to the client-side the dimension of the object in the +form of a vector where the first element indicates the number of rows +and the second element indicates the number of columns. + +## Details + +The function returns the dimension of the server-side input object (e.g. +array, matrix or data frame) from every single study and the pooled +dimension of the object by summing up the individual dimensions returned +from each study. + +Server function called: `dimDS` + +## See also + +[`ds.dataFrame`](ds.dataFrame.md) to generate a table of the type data +frame. + +[`ds.changeRefGroup`](ds.changeRefGroup.md) to change the reference +level of a factor. + +[`ds.colnames`](ds.colnames.md) to obtain the column names of a matrix +or a data frame + +[`ds.asMatrix`](ds.asMatrix.md) to coerce an object into a matrix type. + +[`ds.length`](ds.length.md) to obtain the size of a vector. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples diff --git a/docs/reference/ds.dmtC2S.html b/docs/reference/ds.dmtC2S.html index 046e46df..58379b66 100644 --- a/docs/reference/ds.dmtC2S.html +++ b/docs/reference/ds.dmtC2S.html @@ -1,56 +1,50 @@ -Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Creates a data.frame, matrix or tibble on the serverside that is equivalent to that same data.frame, matrix or tibble (DMT) on the clientside.

    -
    +
    +

    Usage

    ds.dmtC2S(dfdata = NA, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    dfdata
    @@ -85,13 +79,13 @@

    Arguments

    appropriate call will be datasources=connections.xyz[c(1,3)]

    -
    -

    Value

    +
    +

    Value

    the object specified by the <newobj> argument (or default name "dmt.copied.C2S") which is written as a data.frame/matrix/tibble to the serverside.

    -
    -

    Details

    +
    +

    Details

    ds.dmtC2S calls assign function dmtC2SDS. To keep the function simple (though less flexible), a number of the parameters specifying the DMT to be generated on the serverside are fixed by the @@ -107,28 +101,24 @@

    Details

    the DMT to be copied. <byrow> specifies writing the serverside DMT by columns or by rows and this is defaulted to byrow=FALSE i.e. "by column".

    -
    -

    Author

    +
    +

    Author

    Paul Burton for DataSHIELD Development Team - 3rd June, 2021

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.dmtC2S.md b/docs/reference/ds.dmtC2S.md new file mode 100644 index 00000000..8babaf0d --- /dev/null +++ b/docs/reference/ds.dmtC2S.md @@ -0,0 +1,77 @@ +# Copy a clientside data.frame, matrix or tibble to the serverside + +Creates a data.frame, matrix or tibble on the serverside that is +equivalent to that same data.frame, matrix or tibble (DMT) on the +clientside. + +## Usage + +``` r +ds.dmtC2S(dfdata = NA, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- dfdata: + + is a character string that specifies the name of the DMT to be copied + from the clientside to the serverside + +- newobj: + + A character string specifying the name of the DMT on the serverside to + which the output is to be written. If no \ argument is + specified or it is NULL the name of the copied DMT defaults to + "dmt.copied.C2S". + +- datasources: + + specifies the particular 'connection object(s)' to use. e.g. if you + have several data sets in the sources you are working with called + opals.a, opals.w2, and connection.xyz, you can choose which of these + to work with. The call 'datashield.connections_find()' lists all of + the different datasets available and if one of these is called + 'default.connections' that will be the dataset used by default if no + other dataset is specified. If you wish to change the connections you + wish to use by default the call + datashield.connections_default('opals.a') will set + 'default.connections' to be 'opals.a' and so in the absence of + specific instructions to the contrary (e.g. by specifying a particular + dataset to be used via the \ argument) all subsequent + function calls will be to the datasets held in opals.a. If the + \ argument is specified, it should be set without + inverted commas: e.g. datasources=opals.a or + datasources=default.connections. The \ argument also + allows you to apply a function solely to a subset of the + studies/sources you are working with. For example, the second source + in a set of three, can be specified using a call such as + datasources=connection.xyz\[2\]. On the other hand, if you wish to + specify solely the first and third sources, the appropriate call will + be datasources=connections.xyz\[c(1,3)\] + +## Value + +the object specified by the \ argument (or default name +"dmt.copied.C2S") which is written as a data.frame/matrix/tibble to the +serverside. + +## Details + +ds.dmtC2S calls assign function dmtC2SDS. To keep the function simple +(though less flexible), a number of the parameters specifying the DMT to +be generated on the serverside are fixed by the characteristics of the +DMT to be copied rather than explicitly specifying them as selected +arguments. In consequence, they have been removed from the list of +arguments and are instead given invariant values in the first few lines +of code. These include: from="clientside.dmt", nrows.scalar=NULL, +ncols.scalar=NULL, byrow = FALSE. The specific value "clientside.dmt" +for the argument \ simply means that the required information is +generated from the characteristics of a clientside DMT. The +\ and \ are fixed empirically by the +number of rows and columns of the DMT to be copied. \ specifies +writing the serverside DMT by columns or by rows and this is defaulted +to byrow=FALSE i.e. "by column". + +## Author + +Paul Burton for DataSHIELD Development Team - 3rd June, 2021 diff --git a/docs/reference/ds.elspline.html b/docs/reference/ds.elspline.html index 877fb3e5..6d24639e 100644 --- a/docs/reference/ds.elspline.html +++ b/docs/reference/ds.elspline.html @@ -1,55 +1,51 @@ -Basis for a piecewise linear spline with meaningful coefficients — ds.elspline • dsBaseClientBasis for a piecewise linear spline with meaningful coefficients — ds.elspline • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is based on the native R function elspline from the lspline package. This function computes the basis of piecewise-linear spline such that, depending on the argument marginal, the coefficients can be interpreted as (1) slopes of consecutive spline segments, or (2) slope change at consecutive knots.

    -
    +
    +

    Usage

    ds.elspline(
       x,
       n,
    @@ -60,8 +56,8 @@ 

    Basis for a piecewise linear spline with meaningful coefficients

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -92,13 +88,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    an object of class "lspline" and "matrix", which its name is specified by the newobj argument (or its default name "elspline.newobj"), is assigned on the serverside.

    -
    -

    Details

    +
    +

    Details

    If marginal is FALSE (default) the coefficients of the spline correspond to slopes of the consecutive segments. If it is TRUE the first coefficient correspond to the slope of the first segment. The consecutive coefficients correspond to the change @@ -106,28 +102,24 @@

    Details

    Function elspline wraps lspline and computes the knot positions such that they cut the range of x into n equal-width intervals.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.elspline.md b/docs/reference/ds.elspline.md new file mode 100644 index 00000000..5404b011 --- /dev/null +++ b/docs/reference/ds.elspline.md @@ -0,0 +1,72 @@ +# Basis for a piecewise linear spline with meaningful coefficients + +This function is based on the native R function `elspline` from the +`lspline` package. This function computes the basis of piecewise-linear +spline such that, depending on the argument marginal, the coefficients +can be interpreted as (1) slopes of consecutive spline segments, or (2) +slope change at consecutive knots. + +## Usage + +``` r +ds.elspline( + x, + n, + marginal = FALSE, + names = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + the name of the input numeric variable + +- n: + + integer greater than 2, knots are computed such that they cut n + equally-spaced intervals along the range of x + +- marginal: + + logical, how to parametrise the spline, see Details + +- names: + + character, vector of names for constructed variables + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `elspline.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +an object of class "lspline" and "matrix", which its name is specified +by the `newobj` argument (or its default name "elspline.newobj"), is +assigned on the serverside. + +## Details + +If marginal is FALSE (default) the coefficients of the spline correspond +to slopes of the consecutive segments. If it is TRUE the first +coefficient correspond to the slope of the first segment. The +consecutive coefficients correspond to the change in slope as compared +to the previous segment. Function elspline wraps lspline and computes +the knot positions such that they cut the range of x into n equal-width +intervals. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.exists.html b/docs/reference/ds.exists.html index 4e434c2d..ab3437d5 100644 --- a/docs/reference/ds.exists.html +++ b/docs/reference/ds.exists.html @@ -1,56 +1,50 @@ -Checks if an object is defined on the server-side — ds.exists • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Looks if an R object of the given name is defined on the server-side. This function is similar to the R function exists.

    -
    +
    +

    Usage

    ds.exists(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -63,13 +57,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.exists returns a logical object. TRUE if the object is on the server-side and FALSE otherwise.

    -
    -

    Details

    +
    +

    Details

    In DataSHIELD it is not possible to see the data on the servers of the collaborating studies. It is only possible to get summaries of objects stored on the server-side. @@ -77,19 +71,19 @@

    Details

    This function checks if an object does exist on the server-side.

    Server function called: exists

    -
    -

    See also

    +
    +

    See also

    ds.class to check the type of an object.

    ds.length to check the length of an object.

    ds.dim to check the dimension of an object.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -130,23 +124,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.exists.md b/docs/reference/ds.exists.md new file mode 100644 index 00000000..ddc552a1 --- /dev/null +++ b/docs/reference/ds.exists.md @@ -0,0 +1,93 @@ +# Checks if an object is defined on the server-side + +Looks if an R object of the given name is defined on the server-side. +This function is similar to the R function `exists`. + +## Usage + +``` r +ds.exists(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of the object to look for. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.exists` returns a logical object. TRUE if the object is on the +server-side and FALSE otherwise. + +## Details + +In DataSHIELD it is not possible to see the data on the servers of the +collaborating studies. It is only possible to get summaries of objects +stored on the server-side. It is however important to know if an object +is defined (i.e. exists) on the server-side. This function checks if an +object does exist on the server-side. + +Server function called: `exists` + +## See also + +[`ds.class`](ds.class.md) to check the type of an object. + +[`ds.length`](ds.length.md) to check the length of an object. + +[`ds.dim`](ds.dim.md) to check the dimension of an object. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Check if the object exist in the server-side + ds.exists(x = "D", + datasources = connections) #All opal servers are used + ds.exists(x = "D", + datasources = connections[1]) #Only the first Opal server is used (study1) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.exp.html b/docs/reference/ds.exp.html index e6a3e241..27c76f2f 100644 --- a/docs/reference/ds.exp.html +++ b/docs/reference/ds.exp.html @@ -1,56 +1,50 @@ -Computes the exponentials in the server-side — ds.exp • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Computes the exponential values for a specified numeric vector. This function is similar to R function exp.

    -
    +
    +

    Usage

    ds.exp(x = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -68,22 +62,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.exp returns a vector for each study of the exponential values for the numeric vector specified in the argument x. The created vectors are stored in the server-side.

    -
    -

    Details

    -

    Server function called: exp.

    +
    +

    Details

    +

    Server function called: expDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki 
    @@ -124,23 +119,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.exp.md b/docs/reference/ds.exp.md new file mode 100644 index 00000000..fc17c34d --- /dev/null +++ b/docs/reference/ds.exp.md @@ -0,0 +1,87 @@ +# Computes the exponentials in the server-side + +Computes the exponential values for a specified numeric vector. This +function is similar to R function `exp`. + +## Usage + +``` r +ds.exp(x = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of a numerical vector. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `exp.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.exp` returns a vector for each study of the exponential values for +the numeric vector specified in the argument `x`. The created vectors +are stored in the server-side. + +## Details + +Server function called: `expDS`. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # compute exponential function of the 'PM_BMI_CONTINUOUS' variable + ds.exp(x = "D$PM_BMI_CONTINUOUS", + newobj = "exp.PM_BMI_CONTINUOUS", + datasources = connections[1]) #only the first Opal server is used (study1) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.extractQuantiles.html b/docs/reference/ds.extractQuantiles.html index a05cd2eb..a33f5292 100644 --- a/docs/reference/ds.extractQuantiles.html +++ b/docs/reference/ds.extractQuantiles.html @@ -1,5 +1,5 @@ -Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles • dsBaseClientSecure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles • dsBaseClient - - -
    -
    +
    -
    - +
    +
    +
    -
    +

    Takes the global ranks and quantiles held in the serverside data data frame that is written by ranksSecureDS4 and named as specified by the argument (<output.ranks.df>) and converts these values into a series of @@ -61,7 +62,8 @@

    Secure ranking of a vector across all sources and use of these ranks to esti serverside at each study separately.

    -
    +
    +

    Usage

    ds.extractQuantiles(
       extract.quantiles,
       extract.summary.output.ranks.df,
    @@ -71,8 +73,8 @@ 

    Secure ranking of a vector across all sources and use of these ranks to esti )

    -
    -

    Arguments

    +
    +

    Arguments

    extract.quantiles
    @@ -132,8 +134,8 @@

    Arguments

    the header file for ds.ranksSecure.

    -
    -

    Value

    +
    +

    Value

    the final main output of ds.extractQuantiles is a data frame object named "final.quantile.df". This contains two vectors. The first named "evaluation.quantiles" lists the full set of quantiles you have requested @@ -149,8 +151,8 @@

    Value

    anywhere in the DataSHIELD environment. For more details see the associated document entitled "secure.global.ranking.docx".

    -
    -

    Details

    +
    +

    Details

    ds.extractQuantiles is a clientside function which should usually be called from within the clientside function ds.ranksSecure.If you try to call ds.extractQuantiles directly(i.e. not by running ds.ranksSecure) you @@ -163,28 +165,24 @@

    Details

    particular this explains how ds.extractQuantiles works. Also see the header file for ds.ranksSecure.

    -
    -

    Author

    +
    +

    Author

    Paul Burton 11th November, 2021

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.extractQuantiles.md b/docs/reference/ds.extractQuantiles.md new file mode 100644 index 00000000..a0b502fa --- /dev/null +++ b/docs/reference/ds.extractQuantiles.md @@ -0,0 +1,123 @@ +# Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies + +Takes the global ranks and quantiles held in the serverside data data +frame that is written by ranksSecureDS4 and named as specified by the +argument (\) and converts these values into a series +of quantile values that identify, for example, which value of V2BR +across all of the studies corresponds to the median or to the 95 +indication in which study the V2BR corresponding to a particular +quantile falls and, in fact, the relevant value may fall in more than +one study and may appear multiple times in any one study. Finally, the +output data frame containing this information is written to the +clientside and to the serverside at each study separately. + +## Usage + +``` r +ds.extractQuantiles( + extract.quantiles, + extract.summary.output.ranks.df, + extract.ranks.sort.by, + extract.rm.residual.objects, + extract.datasources = NULL +) +``` + +## Arguments + +- extract.quantiles: + + one of a restricted set of character strings. The value of this + argument is set in choosing the value of the argument + \ in ds.ranksSecure. In summary: to + mitigate disclosure risk only the following set of quantiles can be + generated: + c(0.025,0.05,0.10,0.20,0.25,0.30,0.3333,0.40,0.50,0.60,0.6667, + 0.70,0.75,0.80,0.90,0.95,0.975). The allowable formats for the + argument are of the general form: "0.025-0.975" where the first number + is the lowest quantile to be estimated and the second number is the + equivalent highest quantile to estimate. These two quantiles are then + estimated along with all allowable quantiles in between. The allowable + argument values are then: "0.025-0.975", "0.05-0.95", "0.10-0.90", + "0.20-0.80". Two alternative values are "quartiles" i.e. + c(0.25,0.50,0.75), and "median" i.e. c(0.50). The default value is + "0.05-0.95". For more details, see the associated document + "secure.global.ranking.docx". Also see the header file for + ds.ranksSecure. + +- extract.summary.output.ranks.df: + + a character string which specifies the optional name for the summary + data.frame written to the serverside on each data source that contains + 5 of the key output variables from the ranking procedure pertaining to + that particular data source. If no name has been specified by the + argument \ in ds.ranksSecure, the default + name is allocated as "summary.ranks.df".The only reason the + \ argument needs specifying in + ds.extractQuantiles is because, ds.extractQuantiles is the last + function called by ds.ranksSecure and almost the final command of + ds.extractQuantiles to print out the name of the data frame containing + the summarised ranking information generated by ds.ranksSecure and the + order in which the data frame is laid out. This therefore appears as + the last output produced when ds.ranksSecure is run, and when this + happens it is clear this relates to the main output of ds.ranksSecure + not of ds.extractQuantiles. + +- extract.ranks.sort.by: + + a character string taking two possible values. These are "ID.orig" and + "vals.orig". This is set via the argument \ in + ds.ranksSecure. For more details see the associated document entitled + "secure.global.ranking.docx". Also see the header file for + ds.ranksSecure. + +- extract.rm.residual.objects: + + logical value. Default = TRUE: at the beginning and end of each run of + ds.ranksSecure delete all extraneous objects that are otherwise left + behind. These are not usually needed, but could be of value if one + were investigating a problem with the ranking. FALSE: do not delete + the residual objects + +- extract.datasources: + + specifies the particular opal object(s) to use. This is set via the + argument\ in ds.ranksSecure. For more details see the + associated document entitled "secure.global.ranking.docx". Also see + the header file for ds.ranksSecure. + +## Value + +the final main output of ds.extractQuantiles is a data frame object +named "final.quantile.df". This contains two vectors. The first named +"evaluation.quantiles" lists the full set of quantiles you have +requested for evaluation as specified by the argument +"quantiles.for.estimation" in ds.ranksSecure and explained in more +detail above under the information for the argument "extract.quantiles" +in this function. The second vector is called "final.quantile.vector" +which details the values of V2BR that correspond to the evaluation +quantiles in vector 1. The information in the data frame +"final.quantile.df" is generic: there is no information identifying in +which study each value of V2BR falls. This data frame is written to the +clientside (as it is non-disclosive) and is also copied to the +serverside in every study. This means it is easily accessible from +anywhere in the DataSHIELD environment. For more details see the +associated document entitled "secure.global.ranking.docx". + +## Details + +ds.extractQuantiles is a clientside function which should usually be +called from within the clientside function ds.ranksSecure.If you try to +call ds.extractQuantiles directly(i.e. not by running ds.ranksSecure) +you are almost certainly going to have to set up quite a few vectors and +scalars that are normally set by ds.ranksSecure and this is likely to be +difficult. ds.extractQuantiles itself calls two serverside functions +extractQuantilesDS1 and extractQuantilesDS2. For more details about the +cluster of functions that collectively enable secure global ranking and +estimation of global quantiles see the associated document entitled +"secure.global.ranking.docx". In particular this explains how +ds.extractQuantiles works. Also see the header file for ds.ranksSecure. + +## Author + +Paul Burton 11th November, 2021 diff --git a/docs/reference/ds.forestplot.html b/docs/reference/ds.forestplot.html index 6fdd4937..5b338c85 100644 --- a/docs/reference/ds.forestplot.html +++ b/docs/reference/ds.forestplot.html @@ -1,56 +1,50 @@ -Forestplot for SLMA models — ds.forestplot • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Draws a forestplot of the coefficients for Study-Level Meta-Analysis performed with DataSHIELD

    -
    +
    +

    Usage

    ds.forestplot(mod, variable = NULL, method = "ML", layout = "JAMA")
    -
    -

    Arguments

    +
    +

    Arguments

    mod
    @@ -73,13 +67,13 @@

    Arguments

    See details from ?meta::metagen for the different options.

    -
    -

    Value

    +
    +

    Value

    Results a foresplot object created with `meta::forest`.

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       # Run a logistic regression
       
    @@ -114,23 +108,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.forestplot.md b/docs/reference/ds.forestplot.md new file mode 100644 index 00000000..21d4b17f --- /dev/null +++ b/docs/reference/ds.forestplot.md @@ -0,0 +1,76 @@ +# Forestplot for SLMA models + +Draws a forestplot of the coefficients for Study-Level Meta-Analysis +performed with DataSHIELD + +## Usage + +``` r +ds.forestplot(mod, variable = NULL, method = "ML", layout = "JAMA") +``` + +## Arguments + +- mod: + + `list` List outputted by any of the SLMA models of DataSHIELD + (`ds.glmerSLMA`, `ds.glmSLMA`, `ds.lmerSLMA`) + +- variable: + + `character` (default `NULL`) Variable to meta-analyse and visualise, + by setting this argument to `NULL` (default) the first independent + variable will be used. + +- method: + + `character` (Default `"ML"`) Method to estimate the between study + variance. See details from + [`?meta::metagen`](https://rdrr.io/pkg/meta/man/metagen.html) for the + different options. + +- layout: + + `character` (default `"JAMA"`) Layout of the plot. See details from + [`?meta::metagen`](https://rdrr.io/pkg/meta/man/metagen.html) for the + different options. + +## Value + +Results a foresplot object created with \`meta::forest\`. + +## Examples + +``` r +if (FALSE) { # \dontrun{ + # Run a logistic regression + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Fit the logistic regression model + + mod <- ds.glmSLMA(formula = "DIS_DIAB~GENDER+PM_BMI_CONTINUOUS+LAB_HDL", + data = "D", + family = "binomial", + datasources = connections) + + # Plot the results of the model + ds.forestplot(mod) +} # } +``` diff --git a/docs/reference/ds.gamlss.html b/docs/reference/ds.gamlss.html index 63b40ac9..83254e46 100644 --- a/docs/reference/ds.gamlss.html +++ b/docs/reference/ds.gamlss.html @@ -1,51 +1,49 @@ -Generalized Additive Models for Location Scale and Shape — ds.gamlss • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calls the gamlssDS that is a wrapper function from the gamlss R package. The function returns an object of class "gamlss", which is a generalized additive model for location, scale and shape (GAMLSS). The @@ -55,7 +53,8 @@

    Generalized Additive Models for Location Scale and Shape

    returns the sample percentages below each centile curve.

    -
    +
    +

    Usage

    ds.gamlss(
       formula = NULL,
       sigma.formula = "~1",
    @@ -77,8 +76,8 @@ 

    Generalized Additive Models for Location Scale and Shape

    )
    -
    -

    Arguments

    +
    +

    Arguments

    formula
    @@ -190,40 +189,36 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    a gamlss object with all components as in the native R gamlss function. Individual-level information like the components y (the response response) and residuals (the normalised quantile residuals of the model) are not disclosed to the client-side.

    -
    -

    Details

    +
    +

    Details

    For additional details see the help header of gamlss and centiles functions in native R gamlss package.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.gamlss.md b/docs/reference/ds.gamlss.md new file mode 100644 index 00000000..19744945 --- /dev/null +++ b/docs/reference/ds.gamlss.md @@ -0,0 +1,167 @@ +# Generalized Additive Models for Location Scale and Shape + +This function calls the gamlssDS that is a wrapper function from the +gamlss R package. The function returns an object of class "gamlss", +which is a generalized additive model for location, scale and shape +(GAMLSS). The function also saves the residuals as an object on the +server-side with a name specified by the newobj argument. In addition, +if the argument centiles is set to TRUE, the function calls the centiles +function from the gamlss package and returns the sample percentages +below each centile curve. + +## Usage + +``` r +ds.gamlss( + formula = NULL, + sigma.formula = "~1", + nu.formula = "~1", + tau.formula = "~1", + family = "NO()", + data = NULL, + method = "RS", + mu.fix = FALSE, + sigma.fix = FALSE, + nu.fix = FALSE, + tau.fix = FALSE, + control = c(0.001, 20, 1, 1, 1, 1, Inf), + i.control = c(0.001, 50, 30, 0.001), + centiles = FALSE, + xvar = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- formula: + + a formula object, with the response on the left of an ~ operator, and + the terms, separated by + operators, on the right. Nonparametric + smoothing terms are indicated by pb() for penalised beta splines, cs + for smoothing splines, lo for loess smooth terms and random or ra for + random terms, e.g. 'y~cs(x,df=5)+x1+x2\*x3'. + +- sigma.formula: + + a formula object for fitting a model to the sigma parameter, as in the + formula above, e.g. sigma.formula='~cs(x,df=5)'. + +- nu.formula: + + a formula object for fitting a model to the nu parameter, e.g. + nu.formula='~x'. + +- tau.formula: + + a formula object for fitting a model to the tau parameter, e.g. + tau.formula='~cs(x,df=2)'. + +- family: + + a gamlss.family object, which is used to define the distribution and + the link functions of the various parameters. The distribution + families supported by gamlss() can be found in gamlss.family. + Functions such as 'BI()' (binomial) produce a family object. Also can + be given without the parentheses i.e. 'BI'. Family functions can take + arguments, as in 'BI(mu.link=probit)'. + +- data: + + a data frame containing the variables occurring in the formula. If + this is missing, the variables should be on the parent environment. + +- method: + + a character indicating the algorithm for GAMLSS. Can be either 'RS', + 'CG' or 'mixed'. If method='RS' the function will use the Rigby and + Stasinopoulos algorithm, if method='CG' the function will use the Cole + and Green algorithm, and if method='mixed' the function will use the + RS algorithm twice before switching to the Cole and Green algorithm + for up to 10 extra iterations. + +- mu.fix: + + logical, indicate whether the mu parameter should be kept fixed in the + fitting processes. + +- sigma.fix: + + logical, indicate whether the sigma parameter should be kept fixed in + the fitting processes. + +- nu.fix: + + logical, indicate whether the nu parameter should be kept fixed in the + fitting processes. + +- tau.fix: + + logical, indicate whether the tau parameter should be kept fixed in + the fitting processes. + +- control: + + this sets the control parameters of the outer iterations algorithm + using the gamlss.control function. This is a vector of 7 numeric + values: (i) c.crit (the convergence criterion for the algorithm), (ii) + n.cyc (the number of cycles of the algorithm), (iii) mu.step (the step + length for the parameter mu), (iv) sigma.step (the step length for the + parameter sigma), (v) nu.step (the step length for the parameter + nu), (vi) tau.step (the step length for the parameter tau), (vii) + gd.tol (global deviance tolerance level). The default values for these + 7 parameters are set to c(0.001, 20, 1, 1, 1, 1, Inf). + +- i.control: + + this sets the control parameters of the inner iterations of the RS + algorithm using the glim.control function. This is a vector of 4 + numeric values: (i) cc (the convergence criterion for the + algorithm), (ii) cyc (the number of cycles of the algorithm), (iii) + bf.cyc (the number of cycles of the backfitting algorithm), (iv) + bf.tol (the convergence criterion (tolerance level) for the + backfitting algorithm). The default values for these 4 parameters are + set to c(0.001, 50, 30, 0.001). + +- centiles: + + logical, indicating whether the function centiles() will be used to + tabulate the sample percentages below each centile curve. Default is + set to FALSE. + +- xvar: + + the unique explanatory variable used in the centiles() function. This + variable is used only if the centiles argument is set to TRUE. A + restriction in the centiles function is that it applies to models with + one explanatory variable only. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `gamlss_res`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +a gamlss object with all components as in the native R gamlss function. +Individual-level information like the components y (the response +response) and residuals (the normalised quantile residuals of the model) +are not disclosed to the client-side. + +## Details + +For additional details see the help header of gamlss and centiles +functions in native R gamlss package. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.getWGSR.html b/docs/reference/ds.getWGSR.html index c341b2f2..0439bfae 100644 --- a/docs/reference/ds.getWGSR.html +++ b/docs/reference/ds.getWGSR.html @@ -1,51 +1,45 @@ -Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Calculate WHO Growth Reference z-score for a given anthropometric measurement This function is similar to R function getWGSR from the zscorer package.

    -
    +
    +

    Usage

    ds.getWGSR(
       sex = NULL,
       firstPart = NULL,
    @@ -58,8 +52,8 @@ 

    Computes the WHO Growth Reference z-scores of anthropometric data

    )
    -
    -

    Arguments

    +
    +

    Arguments

    sex
    @@ -132,13 +126,13 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.getWGSR assigns a vector for each study that includes the z-scores for the specified index. The created vectors are stored in the servers.

    -
    -

    Details

    +
    +

    Details

    The function calls the server-side function getWGSRDS that computes the WHO Growth Reference z-scores of anthropometric data for weight, height or length, MUAC (middle upper arm circumference), head circumference, sub-scapular skinfold and triceps skinfold. @@ -147,13 +141,13 @@

    Details

    0 to 60 months for age). It is up to the user to check the ranges and the units of their data.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # Connecting to the Opal servers
    @@ -196,23 +190,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.getWGSR.md b/docs/reference/ds.getWGSR.md new file mode 100644 index 00000000..2bbe5535 --- /dev/null +++ b/docs/reference/ds.getWGSR.md @@ -0,0 +1,164 @@ +# Computes the WHO Growth Reference z-scores of anthropometric data + +Calculate WHO Growth Reference z-score for a given anthropometric +measurement This function is similar to R function `getWGSR` from the +`zscorer` package. + +## Usage + +``` r +ds.getWGSR( + sex = NULL, + firstPart = NULL, + secondPart = NULL, + index = NULL, + standing = NA, + thirdPart = NA, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- sex: + + the name of the binary variable that indicates the sex of the subject. + This must be coded as 1 = male and 2 = female. If in your project the + variable sex has different levels, you should recode the levels to 1 + for males and 2 for females using the `ds.recodeValues` DataSHIELD + function before the use of the `ds.getWGSR`. + +- firstPart: + + Name of variable specifying: + Weight (kg) for BMI/A, W/A, W/H, or W/L + Head circumference (cm) for HC/A + Height (cm) for H/A + Length (cm) for L/A + MUAC (cm) for MUAC/A + Sub-scapular skinfold (mm) for SSF/A + Triceps skinfold (mm) for TSF/A + Give a quoted variable name as in (e.g.) "weight". Be careful with + units (weight in kg; height, length, head circumference, and MUAC in + cm; skinfolds in mm). + +- secondPart: + + Name of variable specifying: + Age (days) for H/A, HC/A, L/A, MUAC/A, SSF/A, or TSF/A + Height (cm) for BMI/A, or W/H + Length (cm) for W/L + Give a quoted variable name as in (e.g.) "age". Be careful with units + (age in days; height and length in cm). + +- index: + + The index to be calculated and added to data. One of: + bfa BMI for age + hca Head circumference for age + hfa Height for age + lfa Length for age + mfa MUAC for age + ssa Sub-scapular skinfold for age + tsa Triceps skinfold for age + wfa Weight for age + wfh Weight for height + wfl Weight for length + Give a quoted index name as in (e.g.) "wfh". + +- standing: + + Variable specifying how stature was measured. If NA (default) then age + (for "hfa" or "lfa") or height rules (for "wfh" or "wfl") will be + applied. This must be coded as 1 = Standing; 2 = Supine; 3 = Unknown. + Missing values will be recoded to 3 = Unknown. Give a single value + (e.g."1"). If no value is specified then height and age rules will be + applied. + +- thirdPart: + + Name of variable specifying age (in days) for BMI/A. Give a quoted + variable name as in (e.g.) "age". Be careful with units (age in days). + If age is given in different units you should convert it in age in + days using the `ds.make` DataSHIELD function before the use of the + `ds.getWGSR`. For example if age is given in months then the + transformation is given by the formula + \$age_days=age_months\*(365.25/12)\$. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Defaults `getWGSR.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.getWGSR` assigns a vector for each study that includes the z-scores +for the specified index. The created vectors are stored in the servers. + +## Details + +The function calls the server-side function `getWGSRDS` that computes +the WHO Growth Reference z-scores of anthropometric data for weight, +height or length, MUAC (middle upper arm circumference), head +circumference, sub-scapular skinfold and triceps skinfold. Note that the +function might fail or return NAs when the variables are outside the +ranges given in the WGS (WHO Child Growth Standards) reference (i.e. 45 +to 120 cm for height and 0 to 60 months for age). It is up to the user +to check the ranges and the units of their data. + +## Author + +Demetris Avraam for DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "ANTHRO.anthro1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "ANTHRO.anthro2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "ANTHRO.anthro3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Generate the weight-for-height (wfh) index + ds.getWGSR(sex = "D$sex", firstPart = "D$weight", secondPart = "D$height", + index = "wfh", newobj = "wfh_index", datasources = connections) + + # Example 2: Generate the BMI for age (bfa) index + ds.getWGSR(sex = "D$sex", firstPart = "D$weight", secondPart = "D$height", + index = "bfa", thirdPart = "D$age", newobj = "bfa_index", datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.glm.html b/docs/reference/ds.glm.html index ddd6de57..e43c44ca 100644 --- a/docs/reference/ds.glm.html +++ b/docs/reference/ds.glm.html @@ -1,51 +1,45 @@ -Fits Generalized Linear Model — ds.glm • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Fits a Generalized Linear Model (GLM) on data from single or multiple sources on the server-side.

    -
    +
    +

    Usage

    ds.glm(
       formula = NULL,
       data = NULL,
    @@ -62,8 +56,8 @@ 

    Fits Generalized Linear Model

    )
    -
    -

    Arguments

    +
    +

    Arguments

    formula
    @@ -132,8 +126,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    Many of the elements of the output list returned by ds.glm are equivalent to those returned by the glm() function in native R. However, potentially disclosive elements @@ -181,8 +175,8 @@

    Value

    the output is generated on the scale of the linear predictor (log rates and log rate ratios) and the natural scale after exponentiation (rates and rate ratios).

    -
    -

    Details

    +
    +

    Details

    Fits a GLM on data from a single source or multiple sources on the server-side. In the latter case, the data are co-analysed (when using ds.glm) by using an approach that is mathematically equivalent to placing all individual-level @@ -302,13 +296,13 @@

    Details

    Server functions called: glmDS1 and glmDS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see Wiki
    @@ -419,23 +413,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.glm.md b/docs/reference/ds.glm.md new file mode 100644 index 00000000..e916c1c0 --- /dev/null +++ b/docs/reference/ds.glm.md @@ -0,0 +1,418 @@ +# Fits Generalized Linear Model + +Fits a Generalized Linear Model (GLM) on data from single or multiple +sources on the server-side. + +## Usage + +``` r +ds.glm( + formula = NULL, + data = NULL, + family = NULL, + offset = NULL, + weights = NULL, + checks = FALSE, + maxit = 20, + CI = 0.95, + viewIter = FALSE, + viewVarCov = FALSE, + viewCor = FALSE, + datasources = NULL +) +``` + +## Arguments + +- formula: + + an object of class formula describing the model to be fitted. For more + information see **Details**. + +- data: + + a character string specifying the name of an (optional) data frame + that contains all of the variables in the GLM formula. + +- family: + + identifies the error distribution function to use in the model. This + can be set as `"gaussian"`, `"binomial"` and `"poisson"`. For more + information see **Details**. + +- offset: + + a character string specifying the name of a variable to be used as an + offset. `ds.glm` does not allow an offset vector to be written + directly into the GLM formula. For more information see **Details**. + +- weights: + + a character string specifying the name of a variable containing prior + regression weights for the fitting process. `ds.glm` does not allow a + weights vector to be written directly into the GLM formula. + +- checks: + + logical. If TRUE `ds.glm` checks the structural integrity of the + model. Default FALSE. For more information see **Details**. + +- maxit: + + a numeric scalar denoting the maximum number of iterations that are + permitted before `ds.glm` declares that the model has failed to + converge. + +- CI: + + a numeric value specifying the confidence interval. Default `0.95`. + +- viewIter: + + logical. If TRUE the results of the intermediate iterations are + printed. If FALSE only final results are shown. Default FALSE. + +- viewVarCov: + + logical. If TRUE the variance-covariance matrix of parameter estimates + is returned. Default FALSE. + +- viewCor: + + logical. If TRUE the correlation matrix of parameter estimates is + returned. Default FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +Many of the elements of the output list returned by `ds.glm` are +equivalent to those returned by the +[`glm()`](https://rdrr.io/r/stats/glm.html) function in native R. +However, potentially disclosive elements such as individual-level +residuals and linear predictor values are blocked. In this case, only +non-disclosive elements are returned from each study separately. + +The list of elements returned by `ds.glm` is mentioned below: + +`Nvalid`: total number of valid observational units across all studies. + +`Nmissing`: total number of observational units across all studies with +at least one data item missing. + +`Ntotal`: total of observational units across all studies, the sum of +valid and missing units. + +`disclosure.risk`: risk of disclosure, the value 1 indicates that one of +the disclosure traps has been triggered in that study. + +`errorMessage`: explanation for any errors or disclosure risks +identified. + +`nsubs`: total number of observational units used by `ds.glm` function. +`nb` usually is the same as `nvalid`. + +`iter`: total number of iterations before convergence achieved. + +`family`: error family and link function. + +`formula`: model formula, see description of formula as an input +parameter (above). + +`coefficients`: a matrix with 5 columns: + +- First: + + : the names of all of the regression parameters (coefficients) in the + model + +- second: + + : the estimated values + +- third: + + : corresponding standard errors of the estimated values + +- fourth: + + : the ratio of estimate/standard error + +- fifth: + + : the p-value treating that as a standardised normal deviate + +`dev`: residual deviance. + +`df`: residual degrees of freedom. `nb` residual degrees of freedom + +number of parameters in model = `nsubs`. + +`output.information`: reminder to the user that there is more +information at the top of the output. + +Also, the estimated coefficients and standard errors expanded with +estimated confidence intervals with % coverage specified by `ci` +argument are returned. For the poisson model, the output is generated on +the scale of the linear predictor (log rates and log rate ratios) and +the natural scale after exponentiation (rates and rate ratios). + +## Details + +Fits a GLM on data from a single source or multiple sources on the +server-side. In the latter case, the data are co-analysed (when using +`ds.glm`) by using an approach that is mathematically equivalent to +placing all individual-level data from all sources in one central +warehouse and analysing those data using the conventional +[`glm()`](https://rdrr.io/r/stats/glm.html) function in R. In this +situation marked heterogeneity between sources should be corrected +(where possible) with fixed effects. For example, if each study in a +(binary) logistic regression analysis has an independent intercept, it +is equivalent to allowing each study to have a different baseline risk +of disease. This may also be viewed as being an IP (individual person) +meta-analysis with fixed effects. + +In `formula` most shortcut notation for formulas allowed under R's +standard [`glm()`](https://rdrr.io/r/stats/glm.html) function is also +allowed by `ds.glm`. + +Many GLMs can be fitted very simply using a formula such as: + +\\y~a+b+c+d\\ + +which simply means fit a GLM with `y` as the outcome variable and `a`, +`b`, `c` and `d` as covariates. By default all such models also include +an intercept (regression constant) term. + +Instead, if you need to fit a more complex model, for example: + +\\EVENT~1+TID+SEXF\*AGE.60\\ + +In the above model the outcome variable is `EVENT` and the covariates +`TID` (factor variable with level values between 1 and 6 denoting the +period time), `SEXF` (factor variable denoting sex) and `AGE.60` +(quantitative variable representing age-60 in years). The term `1` +forces the model to include an intercept term, in contrast if you use +the term `0` the intercept term is removed. The `*` symbol between +`SEXF` and `AGE.60` means fit all possible main effects and interactions +for and between those two covariates. This takes the value 0 in all +males `0 * AGE.60` and in females `1 * AGE.60`. This model is in example +1 of the section **Examples**. In this case the logarithm of the +survival time is added as an offset (`log(survtime)`). + +In the `family` argument can be specified three types of models to fit: + +- `"gaussian"`: + + : conventional linear model with normally distributed errors + +- `"binomial"`: + + : conventional unconditional logistic regression model + +- `"poisson"`: + + : Poisson regression model which is the most used in survival + analysis. The model used Piecewise Exponential Regression (PER) which + typically closely approximates Cox regression in its main estimates + and standard errors. + +At present the gaussian family is automatically coupled with an +`identity` link function, the binomial family with a `logistic` link +function and the poisson family with a `log` link function. + +The `data` argument avoids you having to specify the name of the data +frame in front of each covariate in the formula. For example, if the +data frame is called `DataFrame` you avoid having to write: +\\DataFrame\\y ~ DataFrame\\a + DataFrame\\b + DataFrame\\c + +DataFrame\\d\\ + +The `checks` argument verifies that the variables in the model are all +defined (exist) on the server-side at every study and that they have the +correct characteristics required to fit the model. It is suggested to +make `checks` argument TRUE if an unexplained problem in the model fit +is encountered because the running process takes several minutes. + +In `maxit` Logistic regression and Poisson regression models can require +many iterations, particularly if the starting value of the regression +constant is far away from its actual value that the GLM is trying to +estimate. In consequence we often set `maxit=30` but depending on the +nature of the models you wish to fit, you may wish to be alerted much +more quickly than this if there is a delay in convergence, or you may +wish to all more iterations. + +Privacy protected iterative fitting of a GLM is explained here: + +\(1\) Begin with a guess for the coefficient vector to start iteration 1 +(let's call it `beta.vector[1]`). Using `beta.vector[1]`, run iteration +1 with each source calculating the resultant score vector (and +information matrix) generated by its data - given `beta.vector[1]` - as +the sum of the score vector components (and the sum of the components of +the information matrix) derived from each individual data record in that +source. NB in most models the starting values in `beta.vector[1]` are +set to be zero for all parameters. + +\(2\) Transmit the resultant score vector and information matrix from +each source back to the clientside server (CS) at the analysis centre. +Let's denote `SCORE[1][j]` and `INFORMATION.MATRIX[1][j]` as the score +vector and information matrix generated by study `j` at the end of the +1st iteration. + +\(3\) CS sums the score vectors, and equivalently the information +matrices, across all studies (i.e. `j = 1:S`, where `S` is the number of +studies). Note that, given `beta.vector[1]`, this gives precisely the +same final sums for the score vectors and information matrices as would +have been obtained if all data had been in one central warehoused +database and the overall score vector and information matrix at the end +of the first iteration had been calculated (as is standard) by simply +summing across all individuals. The only difference is that instead of +directly adding all values across all individuals, we first sum across +all individuals in each data source and then sum those study totals +across all studies - i.e. this generates the same ultimate sums + +\(4\) CS then calculates +`sum(SCORES)%*% inverse(sum(INFORMATION.MATRICES))` - heuristically this +may be viewed as being "the sum of the score vectors divided (NB 'matrix +division') by the sum of the information matrices". If one uses the +conventional algorithm (IRLS) to update generalized linear models from +iteration to iteration this quantity happens to be precisely the vector +to be added to the current value of beta.vector (i.e. `beta.vector[1]`) +to obtain `beta.vector[2]` which is the improved estimate of the +beta.vector to be used in iteration 2. This updating algorithm is often +called the IRLS (Iterative Reweighted Least Squares) algorithm - which +is closely related to the Newton Raphson approach but uses the expected +information rather than the observed information. + +\(5\) Repeat steps (2)-(4) until the model converges (using the standard +R convergence criterion). NB An alternative way to coherently pool the +glm across multiple sources is to fit each glm to completion (i.e. +multiple iterations until convergence) in each source and then return +the final parameter estimates and standard errors to the CS where they +could be pooled using study-level meta-analysis. An alternative function +ds.glmSLMA allows you to do this. It will fit the glms to completion in +each source and return the final estimates and standard errors (rather +than score vectors and information matrices). It will then rely on +functions in the R package metafor to meta-analyse the key parameters. + +Server functions called: `glmDS1` and `glmDS2` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + # Example 1: Fitting GLM for survival analysis + # For this analysis we need to load survival data from the server + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Fit the GLM + + # make sure that the outcome is numeric + ds.asNumeric(x.name = "D$cens", + newobj = "EVENT", + datasources = connections) + + # convert time id variable to a factor + + ds.asFactor(input.var.name = "D$time.id", + newobj = "TID", + datasources = connections) + + # create in the server-side the log(survtime) variable + + ds.log(x = "D$survtime", + newobj = "log.surv", + datasources = connections) + + ds.glm(formula = EVENT ~ 1 + TID + female * age.60, + data = "D", + family = "poisson", + offset = "log.surv", + weights = NULL, + checks = FALSE, + maxit = 20, + CI = 0.95, + viewIter = FALSE, + viewVarCov = FALSE, + viewCor = FALSE, + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + + # Example 2: run a logistic regression without interaction + # For this example we are going to load another dataset + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Fit the logistic regression model + + mod <- ds.glm(formula = "DIS_DIAB~GENDER+PM_BMI_CONTINUOUS+LAB_HDL", + data = "D", + family = "binomial", + datasources = connections) + + mod #visualize the results of the model + +# Example 3: fit a standard Gaussian linear model with an interaction +# We are using the same data as in example 2. + +mod <- ds.glm(formula = "PM_BMI_CONTINUOUS~DIS_DIAB*GENDER+LAB_HDL", + data = "D", + family = "gaussian", + datasources = connections) +mod + +# Clear the Datashield R sessions and logout +datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.glmPredict.html b/docs/reference/ds.glmPredict.html index e1f5ef23..c30ef77a 100644 --- a/docs/reference/ds.glmPredict.html +++ b/docs/reference/ds.glmPredict.html @@ -1,51 +1,45 @@ -Applies predict.glm() to a serverside glm object — ds.glmPredict • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Applies native R's predict.glm() function to a serverside glm object previously created using ds.glmSLMA.

    -
    +
    +

    Usage

    ds.glmPredict(
       glmname = NULL,
       newdataname = NULL,
    @@ -59,8 +53,8 @@ 

    Applies predict.glm() to a serverside glm object

    )
    -
    -

    Arguments

    +
    +

    Arguments

    glmname
    @@ -161,8 +155,8 @@

    Arguments

    appropriate call will be datasources=connections.xyz[c(1,3)]

    -
    -

    Value

    +
    +

    Value

    ds.glmPredict calls the serverside assign function glmPredictDS.as which writes a new object to the serverside containing output precisely equivalent to predict.glm in native R. The name for this serverside object is given by @@ -184,8 +178,8 @@

    Value

    summary statistics for each column in fit and se.fit matrices which each have k columns if k terms are being summarised.

    -
    -

    Details

    +
    +

    Details

    Clientside function calling a single assign function (glmPredictDS.as) and a single aggregate function (glmPredictDS.ag). ds.glmPredict applies the native R predict.glm function to a @@ -214,28 +208,24 @@

    Details

    in native R and so all detailed information can be found using help(predict.glm) in native R.

    -
    -

    Author

    +
    +

    Author

    Paul Burton, for DataSHIELD Development Team 13/08/20

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.glmPredict.md b/docs/reference/ds.glmPredict.md new file mode 100644 index 00000000..de76909a --- /dev/null +++ b/docs/reference/ds.glmPredict.md @@ -0,0 +1,187 @@ +# Applies predict.glm() to a serverside glm object + +Applies native R's predict.glm() function to a serverside glm object +previously created using ds.glmSLMA. + +## Usage + +``` r +ds.glmPredict( + glmname = NULL, + newdataname = NULL, + output.type = "response", + se.fit = FALSE, + dispersion = NULL, + terms = NULL, + na.action = "na.pass", + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- glmname: + + is a character string identifying the glm object on serverside to + which predict.glm is to be applied. Equivalent to \ argument + in native R's predict.glm which is described as: a fitted object of + class inheriting from 'glm'. + +- newdataname: + + is a character string identifying an (optional) dataframe on the + serverside in which to look for new covariate values with which to + predict. If omitted, the original fitted linear predictors from the + original glm fit are used as the basis of prediction. Precisely + equivalent to the \ argument in the predict.glm function in + native R. + +- output.type: + + a character string taking the values 'response', 'link' or 'terms'. + The value 'response' generates predictions on the scale of the + original outcome, e.g. as proportions in a logistic regression. These + are often called 'fitted values'. The value 'link' generates + predictions on the scale of the linear predictor, e.g. log-odds in + logistic regression, log-rate or log-count in Poisson regression. The + predictions using 'response' and 'link' are identical for a standard + Gaussian model with an identity link. The value 'terms' returns either + fitted values or predicted values on the link scale based not on the + whole linear predictor but on separate 'terms'. So, if age is modelled + as a five level factor, one of the output components will relate to + predictions (fitted values or link scale predictions) based on all + five levels of age simultaneously. Any simple covariate (e.g. not a + composite factor) will be treated as a term in its own right. + ds.glmPredict's \ argument is precisely equivalent to + the \ argument in native R's predict.glm function. + +- se.fit: + + logical if standard errors for the fitted predictions are required. + Defaults to FALSE when the output contains only a vector (or vectors) + of predicted values. If TRUE, the output also contains corresponding + vectors for the standard errors of the predicted values, and a single + value reporting the scale parameter of the model. ds.glmPredict's + \ argument is precisely equivalent to the corresponding + argument in predict.glm in native R. argument is equivalent to the + \ argument in native R's predict.glm function. + +- dispersion: + + numeric value specifying the dispersion of the GLM fit to be assumed + in computing the standard errors. If omitted, that returned by summary + applied to the glm object is used. e.g. if \ is + unspecified the dispersion assumed for a logistic regression or + Poisson model is 1. But if dispersion is set to 4, the standard errors + of the predictions will all be multiplied by 2 (i.e. sqrt(4)). This is + useful in making predictions from models subject to overdispersion. + ds.glmPredict's \ argument is precisely equivalent to the + corresponding argument in predict.glm in native R. + +- terms: + + a character vector specifying a subset of terms to return in the + prediction. Only applies if output.type='terms'. ds.glmPredict's + \ argument is precisely equivalent to the corresponding + argument in predict.glm in native R. + +- na.action: + + character string determining what should be done with missing values + in the data.frame identified by \. Default is na.pass + which predicts from the specified new data.frame with all NAs left in + place. na.omit removes all rows containing NAs. na.fail stops the + function if there are any NAs anywhere in the data.frame. For further + details see help in native R. + +- newobj: + + a character string specifying the name of the serverside object to + which the output object from the call to ds.glmPredict is to be + written in each study. If no \ argument is specified, the + output object on the serverside defaults to the name "predict_glm". + +- datasources: + + specifies the particular 'connection object(s)' to use. e.g. if you + have several data sets in the sources you are working with called + opals.a, opals.w2, and connection.xyz, you can choose which of these + to work with. The call 'datashield.connections_find()' lists all of + the different datasets available and if one of these is called + 'default.connections' that will be the dataset used by default if no + other dataset is specified. If you wish to change the connections you + wish to use by default the call + datashield.connections_default('opals.a') will set + 'default.connections' to be 'opals.a' and so in the absence of + specific instructions to the contrary (e.g. by specifying a particular + dataset to be used via the \ argument) all subsequent + function calls will be to the datasets held in opals.a. If the + \ argument is specified, it should be set without + inverted commas: e.g. datasources=opals.a or + datasources=default.connections. The \ argument also + allows you to apply a function solely to a subset of the + studies/sources you are working with. For example, the second source + in a set of three, can be specified using a call such as + datasources=connection.xyz\[2\]. On the other hand, if you wish to + specify solely the first and third sources, the appropriate call will + be datasources=connections.xyz\[c(1,3)\] + +## Value + +ds.glmPredict calls the serverside assign function glmPredictDS.as which +writes a new object to the serverside containing output precisely +equivalent to predict.glm in native R. The name for this serverside +object is given by the newobj argument or if that argument is missing or +null it is called "predict_glm". In addition, ds.glmPredict calls the +serverside aggregate function glmPredictDS.ag which returns an object +containing non-disclosive summary statistics relating either to a single +prediction vector called fit or, if se.fit=TRUE, of two vectors 'fit' +and 'se.fit' - the latter containing the standard errors of the +predictions in 'fit'. The non-disclosive summary statistics for the +vector(s) include: length, the total number of valid (non-missing) +values, the number of missing values, the mean and standard deviation of +the valid values and the 5 the output always includes: the name of the +serverside glm object being predicted from, the name - if one was +specified - of the dataframe being used as the basis for predictions, +the output.type specified ('link', 'response' or 'terms'), the value of +the dispersion parameter if one had been specified and the residual +scale parameter (which is multiplied by sqrt(dispersion parameter) if +one has been set). If output.type = 'terms', the summary statistics for +the fit and se.fit vectors are replaced by equivalent summary statistics +for each column in fit and se.fit matrices which each have k columns if +k terms are being summarised. + +## Details + +Clientside function calling a single assign function (glmPredictDS.as) +and a single aggregate function (glmPredictDS.ag). ds.glmPredict applies +the native R predict.glm function to a glm object that has already been +created on the serverside by fitting ds.glmSLMA. This is precisely the +same as the glm object created in native R by fitting a glm using the +glm function. Crucially, if ds.glmSLMA was originally applied to +multiple studies the glm object created on each study is based solely on +data from that study. ds.glmPredict has two distinct actions. First, the +call to the assign function applies the standard predict.glm function of +native R to the glm object on the serverside and writes all the output +that would normally be generated by predict.glm to a newobj on the +serverside. Because no critical information is passed to the clientside, +there are no disclosure issues associated with this action. Any standard +DataSHIELD functions can then be applied to the newobj to interpret the +output. For example, it could be used as the basis for regression +diagnostic plots. Second, the call to the aggregate function creates a +non-disclosive summary of all the information held in the newobj created +by the assign function and returns this summary to the clientside. For +example, the full list of predicted/fitted values generated by the model +could be disclosive. So although the newobj holds the full vector of +fitted values, only the total number of values, the total number of +valid (non-missing) values, the number of missing values, the mean and +standard deviation of all valid values and the 5 are returned to the +clientside by the aggregate function. The non-DataSHIELD arguments of +ds.glmPredict are precisely the equivalent to those of predict.glm in +native R and so all detailed information can be found using +help(predict.glm) in native R. + +## Author + +Paul Burton, for DataSHIELD Development Team 13/08/20 diff --git a/docs/reference/ds.glmSLMA.html b/docs/reference/ds.glmSLMA.html index 6d9d6bad..217276b5 100644 --- a/docs/reference/ds.glmSLMA.html +++ b/docs/reference/ds.glmSLMA.html @@ -1,51 +1,45 @@ -Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Fits a generalized linear model (GLM) on data from single or multiple sources with pooled co-analysis across studies being based on SLMA (Study Level Meta Analysis).

    -
    +
    +

    Usage

    ds.glmSLMA(
       formula = NULL,
       family = NULL,
    @@ -61,8 +55,8 @@ 

    Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analy )

    -
    -

    Arguments

    +
    +

    Arguments

    formula
    @@ -130,8 +124,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    The serverside aggregate functions glmSLMADS1 and glmSLMADS2 return output to the clientside, while the assign function glmSLMADS.assign simply writes the glm object to the serverside @@ -223,8 +217,8 @@

    Value

    produced specifically by the assign function glmSLMADS.assign that writes out the glm object on the serverside

    -
    -

    Details

    +
    +

    Details

    ds.glmSLMA specifies the structure of a Generalized Linear Model to be fitted separately on each study or data source. Calls serverside functions glmSLMADS1 (aggregate),glmSLMADS2 (aggregate) and glmSLMADS.assign (assign). @@ -371,13 +365,13 @@

    Details

    Server functions called: glmSLMADS1, glmSLMADS2, glmSLMADS.assign

    -
    -

    Author

    +
    +

    Author

    Paul Burton, for DataSHIELD Development Team 07/07/20

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see Wiki
    @@ -485,23 +479,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.glmSLMA.md b/docs/reference/ds.glmSLMA.md new file mode 100644 index 00000000..65fe87d5 --- /dev/null +++ b/docs/reference/ds.glmSLMA.md @@ -0,0 +1,514 @@ +# Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) + +Fits a generalized linear model (GLM) on data from single or multiple +sources with pooled co-analysis across studies being based on SLMA +(Study Level Meta Analysis). + +## Usage + +``` r +ds.glmSLMA( + formula = NULL, + family = NULL, + offset = NULL, + weights = NULL, + combine.with.metafor = TRUE, + newobj = NULL, + dataName = NULL, + checks = FALSE, + maxit = 30, + notify.of.progress = FALSE, + datasources = NULL +) +``` + +## Arguments + +- formula: + + an object of class formula describing the model to be fitted. For more + information see **Details**. + +- family: + + identifies the error distribution function to use in the model. + +- offset: + + a character string specifying the name of a variable to be used as an + offset.`ds.glmSLMA` does not allow an offset vector to be written + directly into the GLM formula. + +- weights: + + a character string specifying the name of a variable containing prior + regression weights for the fitting process. `ds.glmSLMA` does not + allow a weights vector to be written directly into the GLM formula. + +- combine.with.metafor: + + logical. If TRUE the estimates and standard errors for each regression + coefficient are pooled across studies using random-effects + meta-analysis under maximum likelihood (ML), restricted maximum + likelihood (REML) or fixed-effects meta-analysis (FE). Default TRUE. + +- newobj: + + a character string specifying the name of the object to which the glm + object representing the model fit on the serverside in each study is + to be written. If no \ argument is specified, the output + object defaults to "new.glm.obj". + +- dataName: + + a character string specifying the name of an (optional) data frame + that contains all of the variables in the GLM formula. + +- checks: + + logical. If TRUE `ds.glmSLMA` checks the structural integrity of the + model. Default FALSE. For more information see **Details**. + +- maxit: + + a numeric scalar denoting the maximum number of iterations that are + permitted before `ds.glmSLMA` declares that the model has failed to + converge. For more information see **Details**. + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +The serverside aggregate functions `glmSLMADS1` and `glmSLMADS2` return +output to the clientside, while the assign function `glmSLMADS.assign` +simply writes the glm object to the serverside created by the model fit +on a given server as a permanent object on that same server. This is +precisely the same as the glm object that is usually created by a call +to glm() in native R and it contains all the same elements (see help for +glm in native R). Because it is a serverside object, no disclosure +blocks apply. However, such disclosure blocks do apply to the +information passed to the clientside. In consequence, rather than +containing all the components of a standard glm object in native R, the +components of the glm object that are returned by `ds.glmSLMA` include: +a mixture of non-disclosive elements of the glm object reported +separately by study included in a list object called `output.summary`; +and a series of other list objects that represent inferences aggregated +across studies. + +the study specific items include: + +`coefficients`: a matrix with 5 columns: + +- First: + + : the names of all of the regression parameters (coefficients) in the + model + +- second: + + : the estimated values + +- third: + + : corresponding standard errors of the estimated values + +- fourth: + + : the ratio of estimate/standard error + +- fifth: + + : the p-value treating that as a standardised normal deviate + +`family`: indicates the error distribution and link function used in the +GLM. + +`formula`: model formula, see description of formula as an input +parameter (above). + +`df.resid`: the residual degrees of freedom around the model. + +`deviance.resid`: the residual deviance around the model. + +`df.null`: the degrees of freedom around the null model (with just an +intercept). + +`dev.null`: the deviance around the null model (with just an intercept). + +`CorrMatrix`: the correlation matrix of parameter estimates. + +`VarCovMatrix`: the variance-covariance matrix of parameter estimates. + +`weights`: the name of the vector (if any) holding regression weights. + +`offset`: the name of the vector (if any) holding an offset (enters glm +with a coefficient of 1.00). + +`cov.scaled`: equivalent to `VarCovMatrix`. + +`cov.unscaled`: equivalent to VarCovMatrix but assuming dispersion +(scale) parameter is 1. + +`Nmissing`: the number of missing observations in the given study. + +`Nvalid`: the number of valid (non-missing) observations in the given +study. + +`Ntotal`: the total number of observations in the given study +(`Nvalid` + `Nmissing`). + +`data`: equivalent to input parameter `dataName` (above). + +`dispersion`: the estimated dispersion parameter: +deviance.resid/df.resid for a gaussian family multiple regression model, +1.00 for logistic and poisson regression. + +`call`: summary of key elements of the call to fit the model. + +`na.action`: chosen method of dealing with missing values. This is +usually, `na.action = na.omit` - see help in native R. + +`iter`: the number of iterations required to achieve convergence of the +glm model in each separate study. + +Once the study-specific output has been returned, `ds.glmSLMA` returns a +series of lists relating to the aggregated inferences across studies. +These include the following: + +`num.valid.studies`: the number of studies with valid output included in +the combined analysis + +`betamatrix.all`: matrix with a row for each regression coefficient and +a column for each study reporting the estimated regression coefficients +by study. + +`sematrix.all`: matrix with a row for each regression coefficient and a +column for each study reporting the standard errors of the estimated +regression coefficients by study. + +`betamatrix.valid`: matrix with a row for each regression coefficient +and a column for each study reporting the estimated regression +coefficients by study but only for studies with valid output (eg not +violating disclosure traps) + +`sematrix.all`: matrix with a row for each regression coefficient and a +column for each study reporting the standard errors of the estimated +regression coefficients by study but only for studies with valid output +(eg not violating disclosure traps) + +`SLMA.pooled.estimates.matrix`: a matrix with a row for each regression +coefficient and six columns. The first two columns contain the pooled +estimate of each regression coefficients and its standard error with +pooling via random effect meta-analysis under maximum likelihood (ML). +Columns 3 and 4 contain the estimates and standard errors from random +effect meta-analysis under REML and columns 5 and 6 the estimates and +standard errors under fixed effect meta-analysis. This matrix is only +returned if the argument combine.with.metafor is set to TRUE. Otherwise, +users can take the `betamatrix.valid` and `sematrix.valid` matrices and +enter them into their meta-analysis package of choice. + +`is.object.created` and `validity.check` are standard items returned by +an assign function when the designated newobj appears to have been +successfully created on the serverside at each study. This output is +produced specifically by the assign function `glmSLMADS.assign` that +writes out the glm object on the serverside + +## Details + +`ds.glmSLMA` specifies the structure of a Generalized Linear Model to be +fitted separately on each study or data source. Calls serverside +functions glmSLMADS1 (aggregate),glmSLMADS2 (aggregate) and +glmSLMADS.assign (assign). From a mathematical perspective, the SLMA +approach (using `ds.glmSLMA`) differs fundamentally from the alternative +approach using `ds.glm`. ds.glm fits the model iteratively across all +studies together. At each iteration the model in every data source has +precisely the same coefficients so when the model converges one +essentially identifies the model that best fits all studies +simultaneously. This mathematically equivalent to placing all +individual-level data from all sources in one central warehouse and +analysing those data as one combined dataset using the conventional +[`glm()`](https://rdrr.io/r/stats/glm.html) function in native R. In +contrast ds.glmSLMA sends a command to every data source to fit the +model required but each separate source simply fits that model to +completion (ie undertakes all iterations until the model converges) and +the estimates (regression coefficients) and their standard errors from +each source are sent back to the client and are then pooled using SLMA +via any approach the user wishes to implement. The ds.glmSLMA functions +includes an argument \ which if TRUE (the +default) pools the models across studies using the metafor function +(from the metafor package) using three optimisation methods: random +effects under maximum likelihood (ML); random effects under restricted +maximum likelihood (REML); or fixed effects (FE). But once the estimates +and standard errors are on the clientside, the user can alternatively +choose to use the metafor package in any way he/she wishes, to pool the +coefficients across studies or, indeed, to use another meta-analysis +package, or their own code. + +Although the ds.glm approach might at first sight appear to be +preferable under all circumstances, this is not always the case. First, +the results from both approaches are generally very similar. Secondly, +the SLMA approach can offer key inferential advantages when there is +marked heterogeneity between sources that cannot simply be corrected by +including fixed-effects in one's ds.glm model that each reflect a study- +or centre-specific effect. In particular, such fixed effects cannot be +guaranteed to generate formal inferences that are unbiased when there is +heterogeneity in the effect that is actually of scientific interest. It +might be argued that one should not try to pool the inferences anyway if +there is marked heterogeneity, but you can use the joint analysis to +formally check for such heterogeneity and then choose to report the +pooled result or separate results from each study individually. +Crucially, unless the heterogeneity is substantial, pooling can be quite +reasonable. Furthermore, if you just fit a ds.glm model without +centre-effects you will in effect be pooling across all studies without +checking for heterogeneity and if heterogeneity exists and if it is +strong you can get theoretically results that are badly confounded by +study. Before we introduced ds.glmSLMA we encountered a real world +example of a ds.glm (without centre effects) which generated combined +inferences over all studies which were more extreme than the results +from any of the individual studies: the lower 95 of the combined +estimate was higher than the upper 95 ALL of the individual studies. +This was clearly incorrect and provided a salutary lesson on the +potential impact of confounding by study if a ds.glm model does not +include appropriate centre-effects. Even if you are going to undertake a +ds.glm analysis (which is slightly more powerful when there is no +heterogeneity) it may still be useful to also carry out a ds.glmSLMA +analysis as this provides a very easy way to examine the extent of +heterogeneity. + +In `formula` Most shortcut notation for formulas allowed under R's +standard [`glm()`](https://rdrr.io/r/stats/glm.html) function is also +allowed by `ds.glmSLMA`. + +Many glms can be fitted very simply using a formula such as: + +\\y~a+b+c+d\\ + +which simply means fit a glm with `y` as the outcome variable and `a`, +`b`, `c` and `d` as covariates. By default all such models also include +an intercept (regression constant) term. + +Instead, if you need to fit a more complex model, for example: + +\\EVENT~1+TID+SEXF\*AGE.60\\ + +In the above model the outcome variable is `EVENT` and the covariates +`TID` (factor variable with level values between 1 and 6 denoting the +period time), `SEXF` (factor variable denoting sex) and `AGE.60` +(quantitative variable representing age-60 in years). The term `1` +forces the model to include an intercept term, in contrast if you use +the term `0` the intercept term is removed. The `*` symbol between +`SEXF` and `AGE.60` means fit all possible main effects and interactions +for and between those two covariates. This takes the value 0 in all +males `0 * AGE.60` and in females `1 * AGE.60`. This model is in example +1 of the section **Examples**. In this case the logarithm of the +survival time is added as an offset (`log(survtime)`). + +In the `family` argument a range of model types can be fitted. This +range has recently been extended to include a number of model types that +are non-standard but are used relatively widely. + +The standard models include: + +- `"gaussian"`: + + : conventional linear model with normally distributed errors + +- `"binomial"`: + + : conventional unconditional logistic regression model + +- `"poisson"`: + + : Poisson regression model which is often used in epidemiological + analysis of counts and rates and is also used in survival analysis. + The Piecewise Exponential Regression (PER) model typically provides a + close approximation to the Cox regression model in its main estimates + and standard errors. + +- `"gamma"`: + + : a family of models for outcomes characterised by a constant + coefficient of variation, i.e. the variance increases with the square + of the expected mean + +- `"quasipoisson"`: + + : a model with a Poisson variance function - variance equals expected + mean - but the residual variance which is fixed to be 1.00 in a + standard Poisson model can then take any value. This is achieved by a + dispersion parameter which is estimated during the model fit and if it + takes the value K it means that the expected variance is K x the + expected mean, which implies that all standard errors will be sqrt(K) + times larger than in a standard Poisson model fitted to the same data. + This allows for the extra uncertainty which is associated with + 'overdispersion' that occurs very commonly with Poisson distributed + data, and typically arises when the count/rate data being modelled + occur in blocks which exhibit heterogeneity of underlying risk which + is not being fully modelled, either by including the blocks themselves + as a factor or by including covariates for all the determinants that + are relevant to that underlying risk. If there is no overdispersion + (K=1) the estimates and standard errors from the quasipoisson model + will be almost identical to those from a standard poisson model. + +- `"quasibinomial"`: + + : a model with a binomial variance function - if P is the expected + proportion of successes, and N is the number of "trials" (always 1 if + analysing binary data which are formally described as having a + Bernoulli distribution (binomial distribution with N=1) the variance + function is N\*(P)\*(1-P). But the residual variance which is fixed to + be 1.00 in a binomial model can take any value. This is achieved by a + dispersion parameter which is estimated during the model fit (see + quasipoisson information above). + +Each class of models has a "canonical link" which represents the link +function that maximises the information extraction by the model. The +gaussian family uses the `identity` link, the poisson family the `log` +link, the binomial/Bernoulli family the `logit` link and the the gamma +family the `reciprocal` link. + +The `dataName` argument avoids you having to specify the name of the +data frame in front of each covariate in the formula. For example, if +the data frame is called `DataFrame` you avoid having to write: +\\DataFrame\\y ~ DataFrame\\a + DataFrame\\b + DataFrame\\c + +DataFrame\\d\\ + +The `checks` argument verifies that the variables in the model are all +defined (exist) on the server-site at every study and that they have the +correct characteristics required to fit the model. It is suggested to +make `checks` argument TRUE only if an unexplained problem in the model +fit is encountered because the running process takes several minutes. + +In `maxit` Logistic regression and Poisson regression models can require +many iterations, particularly if the starting value of the regression +constant is far away from its actual value that the GLM is trying to +estimate. In consequence we often set `maxit=30` but depending on the +nature of the models you wish to fit, you may wish to be alerted much +more quickly than this if there is a delay in convergence, or you may +wish to allow more iterations. + +Server functions called: `glmSLMADS1`, `glmSLMADS2`, `glmSLMADS.assign` + +## Author + +Paul Burton, for DataSHIELD Development Team 07/07/20 + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + # Example 1: Fitting GLM for survival analysis + # For this analysis we need to load survival data from the server + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Fit the GLM + + # make sure that the outcome is numeric + ds.asNumeric(x.name = "D$cens", + newobj = "EVENT", + datasources = connections) + + # convert time id variable to a factor + + ds.asFactor(input.var.name = "D$time.id", + newobj = "TID", + datasources = connections) + + # create in the server-side the log(survtime) variable + + ds.log(x = "D$survtime", + newobj = "log.surv", + datasources = connections) + + ds.glmSLMA(formula = EVENT ~ 1 + TID + female * age.60, + dataName = "D", + family = "poisson", + offset = "log.surv", + weights = NULL, + checks = FALSE, + maxit = 20, + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + + # Example 2: run a logistic regression without interaction + # For this example we are going to load another type of data + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Fit the logistic regression model + + mod <- ds.glmSLMA(formula = "DIS_DIAB~GENDER+PM_BMI_CONTINUOUS+LAB_HDL", + dataName = "D", + family = "binomial", + datasources = connections) + + mod #visualize the results of the model + +# Example 3: fit a standard Gaussian linear model with an interaction +# We are using the same data as in example 2. It is not necessary to +# connect again to the server + +mod <- ds.glmSLMA(formula = "PM_BMI_CONTINUOUS~DIS_DIAB*GENDER+LAB_HDL", + dataName = "D", + family = "gaussian", + datasources = connections) +mod + +# Clear the Datashield R sessions and logout +datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.glmSummary.html b/docs/reference/ds.glmSummary.html index 8364a59b..258f7889 100644 --- a/docs/reference/ds.glmSummary.html +++ b/docs/reference/ds.glmSummary.html @@ -1,60 +1,56 @@ -Summarize a glm object on the serverside — ds.glmSummary • dsBaseClientSummarize a glm object on the serverside — ds.glmSummary • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Summarize a glm object on the serverside to create a summary_glm object. Also identify and return components of both the glm object and the summary_glm object that can safely be sent to the clientside without a risk of disclosure

    -
    +
    +

    Usage

    ds.glmSummary(x.name, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -90,8 +86,8 @@

    Arguments

    appropriate call will be datasources=connections.xyz[c(1,3)]

    -
    -

    Value

    +
    +

    Value

    ds.glmSummary writes a new object to the serverside with name given by the newobj argument or if that argument is missing or null it is called "summary_glm.newobj". In addition, ds.glmSummary returns an object containing two lists to the clientside @@ -109,8 +105,8 @@

    Value

    For further information see help for glm and summary(glm) in native R and for ds.glmSLMA in DataSHIELD.

    -
    -

    Details

    +
    +

    Details

    Clientside function calling a single assign function (glmSummaryDS.as) and a single aggregate function (glmSummaryDS.as). ds.glmSummary summarises a glm object that has already been created on the serverside by fitting ds.glmSLMA @@ -141,28 +137,24 @@

    Details

    glm and summary(glm) in native R. In addition, the elements that ARE returned are listed under "return" below.

    -
    -

    Author

    +
    +

    Author

    Paul Burton, for DataSHIELD Development Team 17/07/20

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.glmSummary.md b/docs/reference/ds.glmSummary.md new file mode 100644 index 00000000..6a39dde3 --- /dev/null +++ b/docs/reference/ds.glmSummary.md @@ -0,0 +1,108 @@ +# Summarize a glm object on the serverside + +Summarize a glm object on the serverside to create a summary_glm object. +Also identify and return components of both the glm object and the +summary_glm object that can safely be sent to the clientside without a +risk of disclosure + +## Usage + +``` r +ds.glmSummary(x.name, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of a glm object on the + serverside that has previously been created e.g. using ds.glmSLMA + +- newobj: + + a character string specifying the name of the object to which the + summary_glm object representing the output of summary(glm object) in + each study is to be written. If no \ argument is specified, + the output object on the serverside defaults to "summary_glm.newobj". + +- datasources: + + specifies the particular 'connection object(s)' to use. e.g. if you + have several data sets in the sources you are working with called + opals.a, opals.w2, and connection.xyz, you can choose which of these + to work with. The call 'datashield.connections_find()' lists all of + the different datasets available and if one of these is called + 'default.connections' that will be the dataset used by default if no + other dataset is specified. If you wish to change the connections you + wish to use by default the call + datashield.connections_default('opals.a') will set + 'default.connections' to be 'opals.a' and so in the absence of + specific instructions to the contrary (e.g. by specifying a particular + dataset to be used via the \ argument) all subsequent + function calls will be to the datasets held in opals.a. If the + \ argument is specified, it should be set without + inverted commas: e.g. datasources=opals.a or + datasources=default.connections. The \ argument also + allows you to apply a function solely to a subset of the + studies/sources you are working with. For example, the second source + in a set of three, can be specified using a call such as + datasources=connection.xyz\[2\]. On the other hand, if you wish to + specify solely the first and third sources, the appropriate call will + be datasources=connections.xyz\[c(1,3)\] + +## Value + +ds.glmSummary writes a new object to the serverside with name given by +the newobj argument or if that argument is missing or null it is called +"summary_glm.newobj". In addition, ds.glmSummary returns an object +containing two lists to the clientside the two lists are named "glm.obj" +and "glm.summary.obj" which contain all of the elements of the original +glm object and the summary_glm object on the serverside but with all +potentially disclosive components set to NA or masked in another way see +"details" above. The elements that are returned with a non-NA value in +the glm.obj list object are: "coefficients", "rank", "family", +"deviance", "aic", "null.deviance", "iter", "df.residual", "df.null", +"converged", "boundary", "call", "formula", "terms", "data", "control", +"method", "contrasts", "xlevels". The elements that are returned with a +non-NA value in the glm.summary.obj list object are: "call", "terms", +"family", "deviance", "aic", "contrasts", "df.residual", +"null.deviance", "df.null", "iter", "coefficients", "aliased", +"dispersion", "df", "cov.unscaled", "cov.scaled". For further +information see help for glm and summary(glm) in native R and for +ds.glmSLMA in DataSHIELD. + +## Details + +Clientside function calling a single assign function (glmSummaryDS.as) +and a single aggregate function (glmSummaryDS.as). ds.glmSummary +summarises a glm object that has already been created on the serverside +by fitting ds.glmSLMA which is precisely the same as the glm object +created by fitting a glm using the glm function in native R. Similarly +the summary_glm object saved to the serverside is precisely equivalent +to the object created using summary(glm object) in R. The glm object +produced from a standard call to glm in R has 32 components. Amongst +these, all of the following thirteen contain information about every +records in the data set and so are disclosive. They are all therefore +set to NA and so convey no information when returned to the clientside: +1.residuals, 2.fitted.values, 3.effects, 4.R, 5.qr, 6.linear.predictors, +7.weights, 8.prior.weights, 9.y, 10.model, 11. na.action, 12.x, 13. +offset. In addition the list element "data" which identifies a +data.frame that was identified as containing all of the variables +required for the model is also disclosive because it doesn't list the +name of the data.frame but rather prints it out in full. However, a user +can benefit from knowing what source of data were used in creating the +glm model and so the element "data" that is returned to the clientside +simply lists the names of all of the columns in the originating +data.frame. Having removed all disclosive elements of the glm object, +ds.glmSummary returns the remaining 19 elements to the clientside. The +object created from a standard call to summary(glm object) in R contains +18 list elements. Only two of these are disclosive - na.action and +deviance.resid and these are therefore set to NA before ds.glmSummary +returns the other 16 to the clientside. Further details of the +components of the glm object and summary_glm object can be found under +help for glm and summary(glm) in native R. In addition, the elements +that ARE returned are listed under "return" below. + +## Author + +Paul Burton, for DataSHIELD Development Team 17/07/20 diff --git a/docs/reference/ds.glmerSLMA.html b/docs/reference/ds.glmerSLMA.html index 30b92225..d5f84227 100644 --- a/docs/reference/ds.glmerSLMA.html +++ b/docs/reference/ds.glmerSLMA.html @@ -1,51 +1,45 @@ -Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    ds.glmerSLMA fits a Generalized Linear Mixed-Effects Model (GLME) on data from one or multiple sources with pooling via SLMA (study-level meta-analysis).

    -
    +
    +

    Usage

    ds.glmerSLMA(
       formula = NULL,
       offset = NULL,
    @@ -67,8 +61,8 @@ 

    Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis)

    -
    -

    Arguments

    +
    +

    Arguments

    formula
    @@ -170,8 +164,8 @@

    Arguments

    If no <newobj> argument is specified, the output object defaults to "new.glmer.obj".

    -
    -

    Value

    +
    +

    Value

    Many of the elements of the output list returned by ds.glmerSLMA are equivalent to those returned by the glmer() function in native R. However, potentially disclosive elements @@ -219,8 +213,8 @@

    Value

    convergence.error.message: reports for each study whether the model converged. If it did not some information about the reason for this is reported.

    -
    -

    Details

    +
    +

    Details

    ds.glmerSLMA fits a generalized linear mixed-effects model (GLME) - e.g. a logistic or Poisson regression model including both fixed and random effects - on data from single or multiple sources.

    @@ -287,13 +281,13 @@

    Details

    tolerance.

    Server function called: glmerSLMADS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see Wiki
    @@ -371,23 +365,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.glmerSLMA.md b/docs/reference/ds.glmerSLMA.md new file mode 100644 index 00000000..60d54d44 --- /dev/null +++ b/docs/reference/ds.glmerSLMA.md @@ -0,0 +1,379 @@ +# Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis + +`ds.glmerSLMA` fits a Generalized Linear Mixed-Effects Model (GLME) on +data from one or multiple sources with pooling via SLMA (study-level +meta-analysis). + +## Usage + +``` r +ds.glmerSLMA( + formula = NULL, + offset = NULL, + weights = NULL, + combine.with.metafor = TRUE, + dataName = NULL, + checks = FALSE, + datasources = NULL, + family = NULL, + control_type = NULL, + control_value = NULL, + nAGQ = 1L, + verbose = 0, + start_theta = NULL, + start_fixef = NULL, + notify.of.progress = FALSE, + assign = FALSE, + newobj = NULL +) +``` + +## Arguments + +- formula: + + an object of class formula describing the model to be fitted. For more + information see **Details**. + +- offset: + + a character string specifying the name of a variable to be used as an + offset. + +- weights: + + a character string specifying the name of a variable containing prior + regression weights for the fitting process. + +- combine.with.metafor: + + logical. If TRUE the estimates and standard errors for each regression + coefficient are pooled across studies using random-effects + meta-analysis under maximum likelihood (ML), restricted maximum + likelihood (REML) or fixed-effects meta-analysis (FE). Default TRUE. + +- dataName: + + a character string specifying the name of a data frame that contains + all of the variables in the GLME formula. For more information see + **Details**. + +- checks: + + logical. If TRUE `ds.glmerSLMA` checks the structural integrity of the + model. Default FALSE. For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- family: + + a character string specifying the distribution of the observed value + of the outcome variable around the predictions generated by the linear + predictor. This can be set as `"binomial"` or `"poisson"`. For more + information see **Details**. + +- control_type: + + an optional character string vector specifying the nature of a + parameter (or parameters) to be modified in the + `convergence control options` which can be viewed or modified via the + `glmerControl` function of the package `lme4`. For more information + see **Details**. + +- control_value: + + numeric representing the new value which you want to allocate the + control parameter corresponding to the `control-type`. For more + information see **Details**. + +- nAGQ: + + an integer value indicating the number of points per axis for + evaluating the adaptive Gauss-Hermite approximation to the + log-likelihood. Defaults 1, corresponding to the Laplace + approximation. For more information see R `glmer` function help. + +- verbose: + + an integer value. If \\verbose \> 0\\ the output is generated during + the optimization of the parameter estimates. If \\verbose \> 1\\ the + output is generated during the individual penalized iteratively + reweighted least squares (PIRLS) steps. Default `verbose` value is 0 + which means no additional output. + +- start_theta: + + a numeric vector of length equal to the number of random effects. + Specify to retain more control over the optimisation. See `glmer()` + for more details. + +- start_fixef: + + a numeric vector of length equal to the number of fixed effects (NB + including the intercept). Specify to retain more control over the + optimisation. See `glmer()` for more details. + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default FALSE. + +- assign: + + a logical, indicates whether the function will call a second + server-side function (an assign) in order to save the regression + outcomes (i.e. a glmerMod object) on each server. Default FALSE. + +- newobj: + + a character string specifying the name of the object to which the + glmerMod object representing the model fit on the serverside in each + study is to be written. This argument is used only when the argument + `assign` is set to TRUE. If no \ argument is specified, the + output object defaults to "new.glmer.obj". + +## Value + +Many of the elements of the output list returned by `ds.glmerSLMA` are +equivalent to those returned by the `glmer()` function in native R. +However, potentially disclosive elements such as individual-level +residuals and linear predictor values are blocked. In this case, only +non-disclosive elements are returned from each study separately. + +The list of elements returned by `ds.glmerSLMA` is mentioned below: + +`coefficients`: a matrix with 5 columns: + +- First: + + : the names of all of the regression parameters (coefficients) in the + model + +- second: + + : the estimated values + +- third: + + : corresponding standard errors of the estimated values + +- fourth: + + : the ratio of estimate/standard error + +- fifth: + + : the p-value treating that as a standardised normal deviate + +`CorrMatrix`: the correlation matrix of parameter estimates. + +`VarCovMatrix`: the variance-covariance matrix of parameter estimates. + +`weights`: the vector (if any) holding regression weights. + +`offset`: the vector (if any) holding an offset. + +`cov.scaled`: equivalent to `VarCovMatrix`. + +`Nmissing`: the number of missing observations in the given study. + +`Nvalid`: the number of valid (non-missing) observations in the given +study. + +`Ntotal`: the total number of observations in the given study +(`Nvalid` + `Nmissing`). + +`data`: equivalent to input parameter `dataName` (above). + +`call`: summary of key elements of the call to fit the model. + +Once the study-specific output has been returned, the function returns +the number of elements relating to the pooling of estimates across +studies via study-level meta-analysis. These are as follows: + +`input.beta.matrix.for.SLMA`: a matrix containing the vector of +coefficient estimates from each study. + +`input.se.matrix.for.SLMA`: a matrix containing the vector of standard +error estimates for coefficients from each study. + +`SLMA.pooled.estimates`: a matrix containing pooled estimates for each +regression coefficient across all studies with pooling under SLMA via +random-effects meta-analysis under maximum likelihood (ML), restricted +maximum likelihood (REML) or via fixed-effects meta-analysis (FE). + +`convergence.error.message`: reports for each study whether the model +converged. If it did not some information about the reason for this is +reported. + +## Details + +`ds.glmerSLMA` fits a generalized linear mixed-effects model (GLME) - +e.g. a logistic or Poisson regression model including both fixed and +random effects - on data from single or multiple sources. + +This function is similar to `glmer` function from `lme4` package in +native R. + +When there are multiple data sources, the GLME is fitted to convergence +in each data source independently. The estimates and standard errors +returned to the client-side which enable cross-study pooling using +Study-Level Meta-Analysis (SLMA). The SLMA used by default `metafor` +package but as the SLMA occurs on the client-side (a standard R +environment), the user can choose any approach to meta-analysis. +Additional information about fitting GLMEs using `glmer` function can be +obtained using R help for `glmer` and the `lme4` package. + +In `formula` most shortcut notation allowed by `glmer()` function is +also allowed by `ds.glmerSLMA`. Many GLMEs can be fitted very simply +using a formula like: \\y~a+b+(1\|c)\\ which simply means fit an GLME +with `y` as the outcome variable (e.g. a binary case-control using a +logistic regression model or a count or a survival time using a Poisson +regression model), `a` and `b` as fixed effects, and `c` as a random +effect or grouping factor. + +It is also possible to fit models with random slopes by specifying a +model such as \\y~a+b+(1+b\|c)\\ where the effect of `b` can vary +randomly between groups defined by `c`. Implicit nesting can be +specified with formulas such as: \\y~a+b+(1\|c/d)\\ or +\\y~a+b+(1\|c)+(1\|c:d)\\. + +The `dataName` argument avoids you having to specify the name of the +data frame in front of each covariate in the formula. For example, if +the data frame is called `DataFrame` you avoid having to write: +\\DataFrame\\y ~ DataFrame\\a + DataFrame\\b + (1 \| DataFrame\\c)\\. + +The `checks` argument verifies that the variables in the model are all +defined (exist) on the server-site at every study and that they have the +correct characteristics required to fit the model. It is suggested to +make `checks` argument TRUE if an unexplained problem in the model fit +is encountered because the running process takes several minutes. + +In the `family` argument can be specified two types of models to fit: + +- `"binomial"`: + + : logistic regression models + +- `"poisson"`: + + : poisson regression models + +Note if you are fitting a gaussian model (a standard linear mixed model) +you should use `ds.lmerSLMA` and not `ds.glmerSLMA`. For more +information you can see R help for `lmer` and `glmer`. + +In `control_type` at present only one such parameter can be modified, +namely the tolerance of the convergence criterion to the gradient of the +log-likelihood at the maximum likelihood achieved. We have enabled this +because our practical experience suggests that in situations where the +model looks to have converged with sensible parameter values but formal +convergence is not being declared if we allow the model to be more +tolerant to a non-zero gradient the same parameter values are obtained +but formal convergence is declared. The default value for the +`check.conv.grad` is `0.001` (note that the default value of this +argument in `ds.lmerSLMA` is `0.002`). + +In `control_value` at present (see `control_type`) the only parameter +this can be is the convergence tolerance `check.conv.grad`. In general, +models will be identified as having converged more readily if the value +set for `check.conv.grad` is increased from its default value (`0.001`). +Please note that the risk of doing this is that the model is also more +likely to be declared as having converged at a local maximum that is not +the global maximum likelihood. This will not generally be a problem if +the likelihood surface is well behaved but if you have a problem with +convergence you might usefully compare all the parameter estimates and +standard errors obtained using the default tolerance (`0.001`) even +though that has not formally converged with those obtained after +convergence using the higher tolerance. + +Server function called: `glmerSLMADS2` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Select all rows without missing values + + ds.completeCases(x1 = "D", newobj = "D.comp", datasources = connections) + + # Fit a Poisson regression model + + ds.glmerSLMA(formula = "LAB_TSC ~ LAB_HDL + (1 | GENDER)", + offset = NULL, + dataName = "D.comp", + datasources = connections, + family = "poisson") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CLUSTER.CLUSTER_SLO1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CLUSTER.CLUSTER_SLO2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CLUSTER.CLUSTER_SLO3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + + # Fit a Logistic regression model + + ds.glmerSLMA(formula = "Male ~ incid_rate +diabetes + (1 | age)", + dataName = "D", + datasources = connections[2],#only the second server is used (study2) + family = "binomial") + + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } + + +``` diff --git a/docs/reference/ds.heatmapPlot.html b/docs/reference/ds.heatmapPlot.html index 8820c3a1..30e09801 100644 --- a/docs/reference/ds.heatmapPlot.html +++ b/docs/reference/ds.heatmapPlot.html @@ -1,49 +1,42 @@ -Generates a Heat Map plot — ds.heatmapPlot • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Generates a heat map plot of the pooled data or one plot for each dataset.

    -
    +
    +

    Usage

    ds.heatmapPlot(
       x = NULL,
       y = NULL,
    @@ -57,8 +50,8 @@ 

    Generates a Heat Map plot

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -115,13 +108,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.heatmapPlot returns to the client-side a heat map plot and a message specifying the number of invalid cells in each study.

    -
    -

    Details

    +
    +

    Details

    The ds.heatmapPlot function first generates a density grid and uses it to plot the graph. Cells of the grid density matrix that hold a count of less than the filter set by @@ -182,32 +175,28 @@

    Details

    to or greater than the pre-specified threshold 'nfilter.noise'.

    Server function called: heatmapPlotDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.heatmapPlot.md b/docs/reference/ds.heatmapPlot.md new file mode 100644 index 00000000..88eda2f1 --- /dev/null +++ b/docs/reference/ds.heatmapPlot.md @@ -0,0 +1,158 @@ +# Generates a Heat Map plot + +Generates a heat map plot of the pooled data or one plot for each +dataset. + +## Usage + +``` r +ds.heatmapPlot( + x = NULL, + y = NULL, + type = "combine", + show = "all", + numints = 20, + method = "smallCellsRule", + k = 3, + noise = 0.25, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string specifying the name of a numerical vector. + +- y: + + a character string specifying the name of a numerical vector. + +- type: + + a character string that represents the type of graph to display. + `type` argument can be set as `'combine'` or `'split'`. Default + `'combine'`. For more information see **Details**. + +- show: + + a character string that represents where the plot should be focused. + `show` argument can be set as `'all'` or `'zoomed'`. Default `'all'`. + For more information see **Details**. + +- numints: + + the number of intervals for a density grid object. Default `numints` + value is `20`. + +- method: + + a character string that defines which heat map will be created. The + `method` argument can be set as `'smallCellsRule'`, `'deterministic'` + or `'probabilistic'`. Default `'smallCellsRule'`. For more information + see **Details**. + +- k: + + the number of the nearest neighbours for which their centroid is + calculated. Default `k` value is `3`. For more information see + **Details**. + +- noise: + + the percentage of the initial variance that is used as the variance of + the embedded noise if the argument `method` is set to + `'probabilistic'`. Default `noise` value is `0.25`. For more + information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.heatmapPlot` returns to the client-side a heat map plot and a +message specifying the number of invalid cells in each study. + +## Details + +The `ds.heatmapPlot` function first generates a density grid and uses it +to plot the graph. Cells of the grid density matrix that hold a count of +less than the filter set by DataSHIELD (usually 5) are considered +invalid and turned into 0 to avoid potential disclosure. A message is +printed to inform the user about the number of invalid cells. The ranges +returned by each study and used in the process of getting the grid +density matrix are not the exact minimum and maximum values but rather +close approximates of the real minimum and maximum value. This was done +to reduce the risk of potential disclosure. + +In the argument `type` can be specified two types of graphics to +display: + +- `'combine'`: + + : a combined heat map plot is displayed + +- `'split'`: + + : each heat map is plotted separately + +In the argument `show` can be specified two options: + +- `'all'`: + + : the ranges of the variables are used as plot limits + +- `'zoomed'`: + + : the plot is zoomed to the region where the actual data are + +In the argument `method` can be specified 3 different heat map to be +created: + +- `'smallCellsRule'`: + + : the heat map of the actual variables is created but grids with low + counts are replaced with grids with zero counts + +- `'deterministic'`: + + : the heat map of the scaled centroids of each `k` nearest neighbours + of the original variables are created, where the value of `k` is set + by the user + +- `'probabilistic'`: + + : the heat map of `'noisy'` variables is generated. The added noise + follows a normal distribution with zero mean and variance equal to a + percentage of the initial variance of each input variable. This + percentage is specified by the user in the argument `noise` + +In the `k` argument the user can choose any value for `k` equal to or +greater than the pre-specified threshold used as a disclosure control +for this method and lower than the number of observations minus the +value of this threshold. By default the value of `k` is set to be equal +to 3 (we suggest k to be equal to, or bigger than, 3). Note that the +function fails if the user uses the default value but the study has set +a bigger threshold. The value of `k` is used only if the argument +`method` is set to `'deterministic'`. Any value of `k` is ignored if the +argument `method` is set to `'probabilistic'` or `'smallCellsRule'`. + +The value of `noise` is used only if the argument `method` is set to +`'probabilistic'`. Any value of `noise` is ignored if the argument +`method` is set to `'deterministic'` or `'smallCellsRule'`. The user can +choose any value for `noise` equal to or greater than the pre-specified +threshold `'nfilter.noise'`. + +Server function called: `heatmapPlotDS` + +## Author + +DataSHIELD Development Team + +## Examples diff --git a/docs/reference/ds.hetcor.html b/docs/reference/ds.hetcor.html index 624f2d55..df9dc28b 100644 --- a/docs/reference/ds.hetcor.html +++ b/docs/reference/ds.hetcor.html @@ -1,49 +1,42 @@ -Heterogeneous Correlation Matrix — ds.hetcor • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is based on the hetcor function from the R package polycor.

    -
    +
    +

    Usage

    ds.hetcor(
       data = NULL,
       ML = TRUE,
    @@ -55,8 +48,8 @@ 

    Heterogeneous Correlation Matrix

    )
    -
    -

    Arguments

    +
    +

    Arguments

    data
    @@ -96,8 +89,8 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    Returns an object of class "hetcor" from each study, with the following components: the correlation matrix; the type of each correlation: "Pearson", "Polychoric", or "Polyserial"; the standard errors of the correlations, if requested; the number (or numbers) of observations on which @@ -105,34 +98,30 @@

    Value

    the method by which any missing data were handled: "complete.obs" or "pairwise.complete.obs"; TRUE for ML estimates, FALSE for two-step estimates.

    -
    -

    Details

    +
    +

    Details

    Computes a heterogenous correlation matrix, consisting of Pearson product-moment correlations between numeric variables, polyserial correlations between numeric and ordinal variables, and polychoric correlations between ordinal variables.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.hetcor.md b/docs/reference/ds.hetcor.md new file mode 100644 index 00000000..95299f33 --- /dev/null +++ b/docs/reference/ds.hetcor.md @@ -0,0 +1,84 @@ +# Heterogeneous Correlation Matrix + +This function is based on the hetcor function from the R package +`polycor`. + +## Usage + +``` r +ds.hetcor( + data = NULL, + ML = TRUE, + std.err = TRUE, + bins = 4, + pd = TRUE, + use = "complete.obs", + datasources = NULL +) +``` + +## Arguments + +- data: + + the name of a data frame consisting of factors, ordered factors, + logical variables, character variables, and/or numeric variables, or + the first of several variables. + +- ML: + + if TRUE, compute maximum-likelihood estimates; if FALSE (default), + compute quick two-step estimates. + +- std.err: + + if TRUE (default), compute standard errors. + +- bins: + + number of bins to use for continuous variables in testing bivariate + normality; the default is 4. + +- pd: + + if TRUE (default) and if the correlation matrix is not + positive-definite, an attempt will be made to adjust it to a + positive-definite matrix, using the nearPD function in the Matrix + package. Note that default arguments to nearPD are used (except + corr=TRUE); for more control call nearPD directly. + +- use: + + if "complete.obs", remove observations with any missing data; if + "pairwise.complete.obs", compute each correlation using all + observations with valid data for that pair of variables. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +Returns an object of class "hetcor" from each study, with the following +components: the correlation matrix; the type of each correlation: +"Pearson", "Polychoric", or "Polyserial"; the standard errors of the +correlations, if requested; the number (or numbers) of observations on +which the correlations are based; p-values for tests of bivariate +normality for each pair of variables; the method by which any missing +data were handled: "complete.obs" or "pairwise.complete.obs"; TRUE for +ML estimates, FALSE for two-step estimates. + +## Details + +Computes a heterogenous correlation matrix, consisting of Pearson +product-moment correlations between numeric variables, polyserial +correlations between numeric and ordinal variables, and polychoric +correlations between ordinal variables. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.histogram.html b/docs/reference/ds.histogram.html index 34035b2d..5521b268 100644 --- a/docs/reference/ds.histogram.html +++ b/docs/reference/ds.histogram.html @@ -1,49 +1,42 @@ -Generates a histogram plot — ds.histogram • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    ds.histogram function plots a non-disclosive histogram in the client-side.

    -
    +
    +

    Usage

    ds.histogram(
       x = NULL,
       type = "split",
    @@ -56,8 +49,8 @@ 

    Generates a histogram plot

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -110,12 +103,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    one or more histogram objects and plots depending on the argument type

    -
    -

    Details

    +
    +

    Details

    ds.histogram function allows the user to plot distinct histograms (one for each study) or a combined histogram that merges the single plots.

    @@ -173,32 +166,28 @@

    Details

    Server function called: histogramDS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.histogram.md b/docs/reference/ds.histogram.md new file mode 100644 index 00000000..4c560d3b --- /dev/null +++ b/docs/reference/ds.histogram.md @@ -0,0 +1,149 @@ +# Generates a histogram plot + +`ds.histogram` function plots a non-disclosive histogram in the +client-side. + +## Usage + +``` r +ds.histogram( + x = NULL, + type = "split", + num.breaks = 10, + method = "smallCellsRule", + k = 3, + noise = 0.25, + vertical.axis = "Frequency", + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string specifying the name of a numerical vector. + +- type: + + a character string that represents the type of graph to display. The + `type` argument can be set as `'combine'` or `'split'`. Default + `'split'`. For more information see **Details**. + +- num.breaks: + + a numeric specifying the number of breaks of the histogram. Default + value is `10`. + +- method: + + a character string that defines which histogram will be created. The + `method` argument can be set as `'smallCellsRule'`, `'deterministic'` + or `'probabilistic'`. Default `'smallCellsRule'`. For more information + see **Details**. + +- k: + + the number of the nearest neighbours for which their centroid is + calculated. Default `k` value is `3`. For more information see + **Details**. + +- noise: + + the percentage of the initial variance that is used as the variance of + the embedded noise if the argument `method` is set to + `'probabilistic'`. Default `noise` value is `0.25`. For more + information see **Details**. + +- vertical.axis, : + + a character string that defines what is shown in the vertical axis of + the plot. The `vertical.axis` argument can be set as `'Frequency'` or + `'Density'`. Default `'Frequency'`. For more information see + **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +one or more histogram objects and plots depending on the argument `type` + +## Details + +`ds.histogram` function allows the user to plot distinct histograms (one +for each study) or a combined histogram that merges the single plots. + +In the argument `type` can be specified two types of graphics to +display: + +- `'combine'`: + + : a histogram that merges the single plot is displayed. + +- `'split'`: + + : each histogram is plotted separately. + +In the argument `method` can be specified 3 different histograms to be +created: + +- `'smallCellsRule'`: + + : the histogram of the actual variable is created but bins with low + counts are removed. + +- `'deterministic'`: + + : the histogram of the scaled centroids of each `k` nearest neighbours + of the original variable where the value of `k` is set by the user. + +- `'probabilistic'`: + + : the histogram shows the original distribution disturbed by the + addition of random stochastic noise. The added noise follows a normal + distribution with zero mean and variance equal to a percentage of the + initial variance of the input variable. This percentage is specified + by the user in the argument `noise`. + +In the `k` argument the user can choose any value for `k` equal to or +greater than the pre-specified threshold used as a disclosure control +for this method and lower than the number of observations minus the +value of this threshold. By default the value of `k` is set to be equal +to 3 (we suggest k to be equal to, or bigger than, 3). Note that the +function fails if the user uses the default value but the study has set +a bigger threshold. The value of `k` is used only if the argument +`method` is set to `'deterministic'`. Any value of k is ignored if the +argument `method` is set to `'probabilistic'` or `'smallCellsRule'`. + +In the `noise` argument the percentage of the initial variance that is +used as the variance of the embedded noise if the argument `method` is +set to `'probabilistic'`. Any value of noise is ignored if the argument +`method` is set to `'deterministic'` or `'smallCellsRule'`. The user can +choose any value for noise equal to or greater than the pre-specified +threshold `'nfilter.noise'`. By default the value of noise is set to be +equal to 0.25. + +In the argument `vertical.axis` can be specified two types of +histograms: + +- `'Frequency'`: + + : the histogram of the frequencies is returned. + +- `'Density'`: + + : the histogram of the densities is returned. + +Server function called: `histogramDS2` + +## Author + +DataSHIELD Development Team + +## Examples diff --git a/docs/reference/ds.igb_standards.html b/docs/reference/ds.igb_standards.html index d7470a1c..a5367198 100644 --- a/docs/reference/ds.igb_standards.html +++ b/docs/reference/ds.igb_standards.html @@ -1,49 +1,42 @@ -Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Converts birth measurements to INTERGROWTH z-scores/centiles (generic)

    -
    +
    +

    Usage

    ds.igb_standards(
       gagebrth = NULL,
       z = 0,
    @@ -57,8 +50,8 @@ 

    Converts birth measurements to intergrowth z-scores/centiles

    )
    -
    -

    Arguments

    +
    +

    Arguments

    gagebrth
    @@ -105,17 +98,17 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    assigns the converted measurement as a new object on the server-side

    -
    -

    Note

    +
    +

    Note

    For gestational ages between 24 and 33 weeks, the INTERGROWTH very early preterm standard is used.

    -
    -

    References

    +
    +

    References

    • Villar, J., Ismail, L.C., Victora, C.G., Ohuma, E.O., Bertino, E., Altman, D.G., Lambert, A., Papageorghiou, A.T., Carvalho, M., Jaffer, Y.A., @@ -128,28 +121,24 @@

      References

      Kennedy, S.H., 2016. INTERGROWTH-21st very preterm size at birth reference charts. The Lancet 387, 844–845. https://doi.org/10.1016/S0140-6736(16)00384-6

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.igb_standards.md b/docs/reference/ds.igb_standards.md new file mode 100644 index 00000000..f668b731 --- /dev/null +++ b/docs/reference/ds.igb_standards.md @@ -0,0 +1,99 @@ +# Converts birth measurements to intergrowth z-scores/centiles + +Converts birth measurements to INTERGROWTH z-scores/centiles (generic) + +## Usage + +``` r +ds.igb_standards( + gagebrth = NULL, + z = 0, + p = 50, + val = NULL, + var = NULL, + sex = NULL, + fun = "igb_value2zscore", + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- gagebrth: + + the name of the "gestational age at birth in days" variable. + +- z: + + z-score(s) to convert (must be between 0 and 1). Default value is 0. + This value is used only if `fun` is set to "igb_zscore2value". + +- p: + + centile(s) to convert (must be between 0 and 100). Default value is + p=50. This value is used only if `fun` is set to "igb_centile2value". + +- val: + + the name of the anthropometric variable to convert. + +- var: + + the name of the measurement to convert ("lencm", "wtkg", "hcircm", + "wlr"). + +- sex: + + the name of the sex factor variable. The variable should be coded as + Male/Female. If it is coded differently (e.g. 0/1), then you can use + the ds.recodeValues function to recode the categories to Male/Female + before the use of ds.igb_standards. + +- fun: + + the name of the function to be used. This can be one of: + "igb_centile2value", "igb_zscore2value", "igb_value2zscore" (default), + "igb_value2centile". + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default name is set to `igb.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +assigns the converted measurement as a new object on the server-side + +## Note + +For gestational ages between 24 and 33 weeks, the INTERGROWTH very early +preterm standard is used. + +## References + +- Villar, J., Ismail, L.C., Victora, C.G., Ohuma, E.O., Bertino, E., + Altman, D.G., Lambert, A., Papageorghiou, A.T., Carvalho, M., Jaffer, + Y.A., Gravett, M.G., Purwar, M., Frederick, I.O., Noble, A.J., Pang, + R., Barros, F.C., Chumlea, C., Bhutta, Z.A., Kennedy, S.H., 2014. + International standards for newborn weight, length, and head + circumference by gestational age and sex: the Newborn Cross-Sectional + Study of the INTERGROWTH-21st Project. The Lancet 384, 857–868. + https://doi.org/10.1016/S0140-6736(14)60932-6 + +- Villar, J., Giuliani, F., Fenton, T.R., Ohuma, E.O., Ismail, L.C., + Kennedy, S.H., 2016. INTERGROWTH-21st very preterm size at birth + reference charts. The Lancet 387, 844–845. + https://doi.org/10.1016/S0140-6736(16)00384-6 + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.isNA.html b/docs/reference/ds.isNA.html index 587e51a8..4f525789 100644 --- a/docs/reference/ds.isNA.html +++ b/docs/reference/ds.isNA.html @@ -1,56 +1,50 @@ -Checks if a server-side vector is empty — ds.isNA • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    this function is similar to R function is.na but instead of a vector of booleans it returns just one boolean to tell if all the elements are missing values.

    -
    -
    ds.isNA(x = NULL, datasources = NULL)
    +
    +

    Usage

    +
    ds.isNA(x = NULL, datasources = NULL, classConsistencyCheck = TRUE)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -62,30 +56,36 @@

    Arguments

    objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.isNA returns a boolean. If it is TRUE the vector is empty (all values are NA), FALSE otherwise.

    -
    -

    Details

    +
    +

    Details

    In certain analyses such as GLM none of the variables should be missing at complete (i.e. missing value for each observation). Since in DataSHIELD it is not possible to see the data it is important to know whether or not a vector is empty to proceed accordingly.

    Server function called: isNaDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    -  
    +
       # connecting to the Opal servers
     
       require('DSI')
    @@ -93,28 +93,28 @@ 

    Examples

    require('dsBaseClient') builder <- DSI::newDSLoginBuilder() - builder$append(server = "study1", - url = "http://192.168.56.100:8080/", - user = "administrator", password = "datashield_test&", + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", table = "CNSIM.CNSIM1", driver = "OpalDriver") - builder$append(server = "study2", - url = "http://192.168.56.100:8080/", - user = "administrator", password = "datashield_test&", + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", table = "CNSIM.CNSIM2", driver = "OpalDriver") builder$append(server = "study3", - url = "http://192.168.56.100:8080/", - user = "administrator", password = "datashield_test&", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", table = "CNSIM.CNSIM3", driver = "OpalDriver") logindata <- builder$build() - - connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") - + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + # check if all the observation of the variable 'LAB_HDL' are missing (NA) ds.isNA(x = 'D$LAB_HDL', datasources = connections) #all servers are used ds.isNA(x = 'D$LAB_HDL', - datasources = connections[1]) #only the first server is used (study1) - + datasources = connections[1]) #only the first server is used (study1) + # clear the Datashield R sessions and logout datashield.logout(connections) @@ -123,23 +123,19 @@

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.isNA.md b/docs/reference/ds.isNA.md new file mode 100644 index 00000000..a43a9627 --- /dev/null +++ b/docs/reference/ds.isNA.md @@ -0,0 +1,93 @@ +# Checks if a server-side vector is empty + +this function is similar to R function `is.na` but instead of a vector +of booleans it returns just one boolean to tell if all the elements are +missing values. + +## Usage + +``` r +ds.isNA(x = NULL, datasources = NULL, classConsistencyCheck = TRUE) +``` + +## Arguments + +- x: + + a character string specifying the name of the vector to check. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.isNA` returns a boolean. If it is TRUE the vector is empty (all +values are NA), FALSE otherwise. + +## Details + +In certain analyses such as GLM none of the variables should be missing +at complete (i.e. missing value for each observation). Since in +DataSHIELD it is not possible to see the data it is important to know +whether or not a vector is empty to proceed accordingly. + +Server function called: `isNaDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # check if all the observation of the variable 'LAB_HDL' are missing (NA) + ds.isNA(x = 'D$LAB_HDL', + datasources = connections) #all servers are used + ds.isNA(x = 'D$LAB_HDL', + datasources = connections[1]) #only the first server is used (study1) + + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.isValid.html b/docs/reference/ds.isValid.html index 9ba97804..b42f322c 100644 --- a/docs/reference/ds.isValid.html +++ b/docs/reference/ds.isValid.html @@ -1,56 +1,50 @@ -Checks if a server-side object is valid — ds.isValid • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Checks if a vector or table structure has a number of observations equal to or greater than the threshold set by DataSHIELD.

    -
    +
    +

    Usage

    ds.isValid(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -63,12 +57,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.isValid returns a boolean. If it is TRUE input object is valid, FALSE otherwise.

    -
    -

    Details

    +
    +

    Details

    In DataSHIELD, analyses are possible only on valid objects to ensure the output is not disclosive. This function checks if an input object is valid. A vector is valid if the number of observations is equal to or greater than a set threshold. A factor vector is valid if all @@ -76,13 +70,13 @@

    Details

    is valid if the number of rows is equal or greater than the set threshold.

    Server function called: isValidDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -123,23 +117,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.isValid.md b/docs/reference/ds.isValid.md new file mode 100644 index 00000000..7278e42c --- /dev/null +++ b/docs/reference/ds.isValid.md @@ -0,0 +1,88 @@ +# Checks if a server-side object is valid + +Checks if a vector or table structure has a number of observations equal +to or greater than the threshold set by DataSHIELD. + +## Usage + +``` r +ds.isValid(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of a vector, dataframe or + matrix. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.isValid` returns a boolean. If it is TRUE input object is valid, +FALSE otherwise. + +## Details + +In DataSHIELD, analyses are possible only on valid objects to ensure the +output is not disclosive. This function checks if an input object is +valid. A vector is valid if the number of observations is equal to or +greater than a set threshold. A factor vector is valid if all its levels +(categories) have a count equal or greater than the set threshold. A +data frame or a matrix is valid if the number of rows is equal or +greater than the set threshold. + +Server function called: `isValidDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Check if the dataframe assigned above is valid + ds.isValid(x = 'D', + datasources = connections) #all servers are used + ds.isValid(x = 'D', + datasources = connections[2]) #only the second server is used (study2) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.kurtosis.html b/docs/reference/ds.kurtosis.html index e765331e..454a4eb4 100644 --- a/docs/reference/ds.kurtosis.html +++ b/docs/reference/ds.kurtosis.html @@ -1,54 +1,53 @@ -Calculates the kurtosis of a numeric variable — ds.kurtosis • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the kurtosis of a numeric variable.

    -
    -
    ds.kurtosis(x = NULL, method = 1, type = "both", datasources = NULL)
    +
    +

    Usage

    +
    ds.kurtosis(
    +  x = NULL,
    +  method = 1,
    +  type = "both",
    +  datasources = NULL,
    +  classConsistencyCheck = FALSE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -73,14 +72,19 @@

    Arguments

    If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default FALSE.

    +
    -
    -

    Value

    -

    a matrix showing the kurtosis of the input numeric variable, the number of valid observations and -the validity message.

    +
    +

    Value

    +

    a matrix showing the kurtosis of the input numeric variable and +the number of valid observations.

    -
    -

    Details

    +
    +

    Details

    The function calculates the kurtosis of an input variable x with three different methods. The method is specified by the argument method. If x contains any missings, the function removes those before the calculation of the kurtosis. If method is set to 1 the following formula is used @@ -90,28 +94,25 @@

    Details

    If method is set to 3 the following formula is used \( kurtosis= (\frac{\sum_{i=1}^{N} (x_i - \bar(x))^4 /N}{(\sum_{i=1}^{N} ((x_i - \bar(x))^2) /N)^(2) })*(1-1/N)^2 - 3\). This function is similar to the function kurtosis in R package e1071.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam, for DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.kurtosis.md b/docs/reference/ds.kurtosis.md new file mode 100644 index 00000000..14e8e3fd --- /dev/null +++ b/docs/reference/ds.kurtosis.md @@ -0,0 +1,76 @@ +# Calculates the kurtosis of a numeric variable + +This function calculates the kurtosis of a numeric variable. + +## Usage + +``` r +ds.kurtosis( + x = NULL, + method = 1, + type = "both", + datasources = NULL, + classConsistencyCheck = FALSE +) +``` + +## Arguments + +- x: + + a string character, the name of a numeric variable. + +- method: + + an integer between 1 and 3 selecting one of the algorithms for + computing kurtosis detailed below. The default value is set to 1. + +- type: + + a character which represents the type of analysis to carry out. If + `type` is set to 'combine', 'combined', 'combines' or 'c', the global + kurtosis is returned if `type` is set to 'split', 'splits' or 's', the + kurtosis is returned separately for each study. if `type` is set to + 'both' or 'b', both sets of outputs are produced. The default value is + set to 'both'. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default FALSE. + +## Value + +a matrix showing the kurtosis of the input numeric variable and the +number of valid observations. + +## Details + +The function calculates the kurtosis of an input variable x with three +different methods. The method is specified by the argument `method`. If +x contains any missings, the function removes those before the +calculation of the kurtosis. If `method` is set to 1 the following +formula is used \\ kurtosis= \frac{\sum\_{i=1}^{N} (x_i - \bar(x))^4 +/N}{(\sum\_{i=1}^{N} ((x_i - \bar(x))^2) /N)^(2) } - 3\\, where \\ +\bar{x} \\ is the mean of x and \\N\\ is the number of observations. If +`method` is set to 2 the following formula is used \\ kurtosis= +((N+1)\*(\frac{\sum\_{i=1}^{N} (x_i - \bar(x))^4 /N}{(\sum\_{i=1}^{N} +((x_i - \bar(x))^2) /N)^(2) } - 3) + 6)\*((N-1)/((N-2)\*(N-3)))\\. If +`method` is set to 3 the following formula is used \\ kurtosis= +(\frac{\sum\_{i=1}^{N} (x_i - \bar(x))^4 /N}{(\sum\_{i=1}^{N} ((x_i - +\bar(x))^2) /N)^(2) })\*(1-1/N)^2 - 3\\. This function is similar to the +function `kurtosis` in R package `e1071`. + +## Author + +Demetris Avraam, for DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands diff --git a/docs/reference/ds.length.html b/docs/reference/ds.length.html index 654c28af..087bb78d 100644 --- a/docs/reference/ds.length.html +++ b/docs/reference/ds.length.html @@ -1,58 +1,58 @@ -Gets the length of an object in the server-side — ds.length • dsBaseClientGets the length of an object in the server-side — ds.length • dsBaseClient - - -
    -
    +
    +
    +
    -
    - -
    +

    This function gets the length of a vector or list that is stored on the server-side. This function is similar to the R function length.

    -
    -
    ds.length(x = NULL, type = "both", checks = "FALSE", datasources = NULL)
    +
    +

    Usage

    +
    ds.length(
    +  x = NULL,
    +  type = "both",
    +  datasources = NULL,
    +  classConsistencyCheck = TRUE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -70,34 +70,34 @@

    Arguments

    Default 'both'.

    -
    checks
    -

    logical. If TRUE the model components are checked. -Default FALSE to save time. It is suggested that checks -should only be undertaken once the function call has failed.

    - -
    datasources

    a list of DSConnection-class objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.length returns to the client-side the pooled length of a vector or a list, or the length of a vector or a list for each study separately.

    -
    -

    Details

    +
    +

    Details

    Server function called: lengthDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -149,23 +149,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.length.md b/docs/reference/ds.length.md new file mode 100644 index 00000000..fa80ea30 --- /dev/null +++ b/docs/reference/ds.length.md @@ -0,0 +1,111 @@ +# Gets the length of an object in the server-side + +This function gets the length of a vector or list that is stored on the +server-side. This function is similar to the R function `length`. + +## Usage + +``` r +ds.length( + x = NULL, + type = "both", + datasources = NULL, + classConsistencyCheck = TRUE +) +``` + +## Arguments + +- x: + + a character string specifying the name of a vector or list. + +- type: + + a character that represents the type of analysis to carry out. If + `type` is set to `'combine'`, `'combined'`, `'combines'` or `'c'`, a + global length is returned if `type` is set to `'split'`, `'splits'` or + `'s'`, the length is returned separately for each study. if `type` is + set to `'both'` or `'b'`, both sets of outputs are produced. Default + `'both'`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.length` returns to the client-side the pooled length of a vector or +a list, or the length of a vector or a list for each study separately. + +## Details + +Server function called: `lengthDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Get the total number of observations of the vector of + # variable 'LAB_TSC' across all the studies + ds.length(x = 'D$LAB_TSC', + type = 'combine', + datasources = connections) + + # Example 2: Get the number of observations of the vector of variable + # 'LAB_TSC' for each study separately + ds.length(x = 'D$LAB_TSC', + type = 'split', + datasources = connections) + + # Example 3: Get the number of observations on each study and the total + # number of observations across all the studies for the variable 'LAB_TSC' + ds.length(x = 'D$LAB_TSC', + type = 'both', + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.levels.html b/docs/reference/ds.levels.html index dfd29416..57c4a10c 100644 --- a/docs/reference/ds.levels.html +++ b/docs/reference/ds.levels.html @@ -1,58 +1,53 @@ -Produces levels attributes of a server-side factor — ds.levels • dsBaseClientProduces levels attributes of a server-side factor — ds.levels • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function provides access to the level attribute of a factor variable stored on the server-side. This function is similar to R function levels.

    -
    +
    +

    Usage

    ds.levels(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -65,22 +60,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.levels returns to the client-side the levels of a factor class variable stored in the server-side.

    -
    -

    Details

    +
    +

    Details

    Server function called: levelsDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -125,23 +121,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.levels.md b/docs/reference/ds.levels.md new file mode 100644 index 00000000..7ce750d5 --- /dev/null +++ b/docs/reference/ds.levels.md @@ -0,0 +1,86 @@ +# Produces levels attributes of a server-side factor + +This function provides access to the level attribute of a factor +variable stored on the server-side. This function is similar to R +function `levels`. + +## Usage + +``` r +ds.levels(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of a factor variable. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.levels` returns to the client-side the levels of a factor class +variable stored in the server-side. + +## Details + +Server function called: `levelsDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Get the levels of the PM_BMI_CATEGORICAL variable + ds.levels(x = 'D$PM_BMI_CATEGORICAL', + datasources = connections)#all servers are used + ds.levels(x = 'D$PM_BMI_CATEGORICAL', + datasources = connections[2])#only the second server is used (study2) + + # Example 2: Get the levels of the LAB_TSC variable + # This example should not work because LAB_TSC is a continuous variable + ds.levels(x = 'D$LAB_TSC', + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.lexis.html b/docs/reference/ds.lexis.html index 131b98ae..ffbb039b 100644 --- a/docs/reference/ds.lexis.html +++ b/docs/reference/ds.lexis.html @@ -1,53 +1,48 @@ -Represents follow-up in multiple states on multiple time scales — ds.lexis • dsBaseClientRepresents follow-up in multiple states on multiple time scales — ds.lexis • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function takes a data frame containing survival data and expands it by converting records at the level of individual subjects (survival time, censoring status, IDs and other variables) into multiple records over a series of pre-defined time intervals.

    -
    +
    +

    Usage

    ds.lexis(
       data = NULL,
       intervalWidth = NULL,
    @@ -61,8 +56,8 @@ 

    Represents follow-up in multiple states on multiple time scales

    )
    -
    -

    Arguments

    +
    +

    Arguments

    data
    @@ -111,13 +106,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.lexis returns to the server-side a data frame for each study with the expanded version of the input table.

    -
    -

    Details

    +
    +

    Details

    The function ds.lexis splits the survival interval time of subjects into pre-specified sub-intervals that are each assumed to encompass a constant base-line hazard which means a constant instantaneous risk of death). In the expanded dataset a row is included for every @@ -215,17 +210,17 @@

    Details

    Server functions called: lexisDS1, lexisDS2 and lexisDS3

    -
    -

    See also

    +
    +

    See also

    ds.glm for generalized linear models.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see Wiki
    @@ -290,23 +285,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.lexis.md b/docs/reference/ds.lexis.md new file mode 100644 index 00000000..54df2990 --- /dev/null +++ b/docs/reference/ds.lexis.md @@ -0,0 +1,271 @@ +# Represents follow-up in multiple states on multiple time scales + +This function takes a data frame containing survival data and expands it +by converting records at the level of individual subjects (survival +time, censoring status, IDs and other variables) into multiple records +over a series of pre-defined time intervals. + +## Usage + +``` r +ds.lexis( + data = NULL, + intervalWidth = NULL, + idCol = NULL, + entryCol = NULL, + exitCol = NULL, + statusCol = NULL, + variables = NULL, + expandDF = NULL, + datasources = NULL +) +``` + +## Arguments + +- data: + + a character string specifying the name of a data frame containing the + survival data to be expanded. + +- intervalWidth: + + a numeric vector specifying the length of each interval. For more + information see **Details**. + +- idCol: + + a character string denoting the column name that holds the individual + IDs of the subjects. For more information see **Details**. + +- entryCol: + + a character string denoting the column name that holds the entry times + (i.e. start of follow up). For more information see **Details**. + +- exitCol: + + a character string denoting the column name that holds the exit times + (i.e. end of follow up). For more information see **Details**. + +- statusCol: + + a character string denoting the column name that holds the + failure/censoring status of each subject. For more information see + **Details**. + +- variables: + + a vector of character strings denoting the column names of additional + variables to include in the final expanded table. For more information + see **Details**. + +- expandDF: + + a character string denoting the name of the new data frame containing + the expanded data set. Default `lexis.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.lexis` returns to the server-side a data frame for each study with +the expanded version of the input table. + +## Details + +The function `ds.lexis` splits the survival interval time of subjects +into pre-specified sub-intervals that are each assumed to encompass a +constant base-line hazard which means a constant instantaneous risk of +death). In the expanded dataset a row is included for every interval in +which a given individual is followed - regardless of how short or long +that period may be. Each row includes: +(1) **CENSOR**: a variable indicating failure status for a particular +interval in that interval also known as censoring status. This variable +can take two values: **1** representing that the patient has died, +relapsed or developed a disease. **0** representing the +lost-to-follow-up or passed right through the interval without +failing. +(2) **SURVTIME** an exposure-time variable indicating the duration of +exposure-to-risk-of-failure the corresponding individual experienced in +that interval before he/she failed or was censored. + +To illustrate, an individual who survives through 5 such intervals and +then dies/fails in the 6th interval will be allocated a 0 value for the +failure status/censoring variable in the first five intervals and a 1 +value in the 6th, while the exposure-time variable will be equal to the +total length of the relevant interval in each of the first five +intervals, and the additional length of time they survived in the sixth +interval before they failed or were censored. If they survive through +the first interval and they are censored in the second interval, the +failure-status variable will take the value 0 in both intervals. +(3) **UID.expanded** the expanded data set also includes a unique ID in +a form such as 77.13 which identifies that row of the dataset as +relating to the 77th individual in the input data set and his/her +experience (exposure-time and failure status)in the 14th interval. Note +that `.N` indicates the `(N+1)`th interval because interval 1 has no +suffix. +(4) **IDSEQ** the first part of `UID.expanded` (before the `'.'`). The +value of this variable is repeated in every row to which the +corresponding individual contributes data (i.e. to every row +corresponding to an interval in which that individual was followed). +(5) The expanded dataset contains any other variables about each +individual that the user would like to carry forward to a survival +analysis based on the expanded data. Typically, this will include the +original ID as specified to the data repository, the total survival time +(equivalent to the sum of the exposure times across all intervals) and +the ultimate failure-status in the final interval to which they were +exposed. The value of each of these variables is also repeated in every +row corresponding to an interval in which that individual was followed. + +In `intervalWidth` argument if the total sum of the duration across all +intervals is less than the maximum follow-up of any individual in any +contributing study, a final interval will be added by `ds.lexis` +extending from the end of the last interval specified to the maximum +follow-up time. If a single numeric value is specified rather than a +vector, `ds.lexis` will keep adding intervals of the length specified +until the maximum follow-up time in any single study is exceeded. This +argument is subject to disclosure checks. + +The `idCol` argument must be a numeric or character. Note that when a +particular variable is identified as being the main ID to the data +repository when the data are first transferred to the data repository +(i.e. before DataSHIELD is used), that ID often ends up being of class +character and will then be sorted in alphabetic order (treating each +digit as a character) rather than numeric. For example, containing the +sequential IDs 1-1000, the order of the IDs will be: +1,10,100,101,102,103,104,105,106,107,108,109,11 ... +In an alphabetic listing: NOT to the expected order: +1,2,3,4,5,6,7,8,9,10,11,12,13 ... + +This alphabetic order or the ID listing will then carry forward to the +expanded dataset. But the nature and order of the original ID variable +held in `idCol` doesn't matter to `ds.lexis`. Provided every individual +appears only once in the original data set (before expansion) the order +does not matter because `ds.lexis` works on its unique numeric vector +that is allocated from `1:M` (where there are `M` individuals) in +whatever order they appear in the original dataset. + +in `entryCol` argument rather than using a total survival time variable +to identify the intervals to which any given individual is exposed, +`ds.lexis` requires an initial entry time and a final exit time. If the +data you wish to expand contain only a total survival time variable and +every individual starts follow-up at time 0, the entry times should all +be specified as zero, and the exit times as the total survival time. So, +`entryCol` should either be the name of the column holding the entry +time of each individual or else if no `entryCol` is specified it will be +defaulted to zero anyway and put into a variable called `starttime` in +the expanded data set. + +In `exitCol` argument, if the entry times (`entryCol`) are set, or +defaulted, to zero, the `exitCol` variable should contain the total +survival times. + +If `variables` argument is not set (is null) but the `data` argument is +set, the expanded data set will contain all variables in the data frame +identified by the `data` argument. If neither the `data` or `variables` +arguments are set, the expanded data set will only include the ID, +exposure time and failure/censoring status variables which may still be +useful for plotting survival data once these become available. + +This function is particularly meant to be used in preparing data for a +piecewise regression analysis (PAR). Although the time intervals have to +be pre-specified and are arbitrary, even a vaguely reasonable set of +time intervals will give results very similar to a Cox regression +analysis. The key issue is to choose survival intervals such that the +baseline hazard (risk of death/disease/failure) within each interval is +reasonably constant while the baseline hazard can vary freely between +intervals. Even if the choice of intervals is very poor the ultimate +results are typically qualitatively similar to Cox regression. +Increasing the number of intervals will inevitably improve the +approximation to the true baseline hazard, but the addition of many more +unnecessary time intervals slows the analysis and can become disclosive +and yet will not improve the fit of the model. + +If the number of failures in one or more periods in a given study is +less than the specified disclosure filter determining minimum acceptable +cell size in a table (`nfilter.tab`) then the expanded data frame is not +created in that study, and a study-side message to this effect is made +available in that study via [`ds.message()`](ds.message.md) function. + +Server functions called: `lexisDS1`, `lexisDS2` and `lexisDS3` + +## See also + +[`ds.glm`](ds.glm.md) for generalized linear models. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + # Example 1: Fitting GLM for survival analysis + # For this analysis we need to load survival data from the server + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Example 1: Create the expanded data frame. + #The survival time intervals are to be 0 -Constructs a list of objects in the server-side — ds.list • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is similar to the R function list.

    -
    +
    +

    Usage

    ds.list(x = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -66,23 +59,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.list returns a list of objects for each study that is stored on the server-side.

    -
    -

    Details

    +
    +

    Details

    If the objects to coerce into a list are for example vectors held in a matrix or a data frame the names of the elements in the list are the names of columns.

    Server function called: listDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -121,23 +114,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.list.md b/docs/reference/ds.list.md new file mode 100644 index 00000000..9640c112 --- /dev/null +++ b/docs/reference/ds.list.md @@ -0,0 +1,86 @@ +# Constructs a list of objects in the server-side + +This is similar to the R function `list`. + +## Usage + +``` r +ds.list(x = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the names of the objects to coerce into + a list. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `list.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.list` returns a list of objects for each study that is stored on the +server-side. + +## Details + +If the objects to coerce into a list are for example vectors held in a +matrix or a data frame the names of the elements in the list are the +names of columns. + +Server function called: `listDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # combine the 'LAB_TSC' and 'LAB_HDL' variables into a list + myobjects <- c('D$LAB_TSC', 'D$LAB_HDL') + ds.list(x = myobjects, + newobj = "new.list", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.listClientsideFunctions.html b/docs/reference/ds.listClientsideFunctions.html index defc02cd..27c501ef 100644 --- a/docs/reference/ds.listClientsideFunctions.html +++ b/docs/reference/ds.listClientsideFunctions.html @@ -1,71 +1,64 @@ -Lists client-side functions — ds.listClientsideFunctions • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Lists all current client-side functions

    -
    +
    +

    Usage

    ds.listClientsideFunctions()
    -
    -

    Value

    +
    +

    Value

    ds.listClientsideFunctions returns a list containing all server-side functions.

    -
    -

    Details

    +
    +

    Details

    This function operates by directly interrogating the R objects stored in the input client packages and objects of name starting with ds. character in .GlobalEnv.

    This function does not call any server-side function.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -78,23 +71,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.listClientsideFunctions.md b/docs/reference/ds.listClientsideFunctions.md new file mode 100644 index 00000000..1004165b --- /dev/null +++ b/docs/reference/ds.listClientsideFunctions.md @@ -0,0 +1,41 @@ +# Lists client-side functions + +Lists all current client-side functions + +## Usage + +``` r +ds.listClientsideFunctions() +``` + +## Value + +`ds.listClientsideFunctions` returns a list containing all server-side +functions. + +## Details + +This function operates by directly interrogating the R objects stored in +the input client packages and objects of name starting with `ds.` +character in `.GlobalEnv`. + +This function does not call any server-side function. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + #Library with all DataSHIELD functions + require('dsBaseClient') + + #Visualise all functions + ds.listClientsideFunctions() + +} # } +``` diff --git a/docs/reference/ds.listDisclosureSettings.html b/docs/reference/ds.listDisclosureSettings.html index d539d43c..f6e43713 100644 --- a/docs/reference/ds.listDisclosureSettings.html +++ b/docs/reference/ds.listDisclosureSettings.html @@ -1,54 +1,47 @@ -Lists disclosure settings — ds.listDisclosureSettings • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Lists current values for disclosure control filters in all data repository servers.

    -
    +
    +

    Usage

    ds.listDisclosureSettings(datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    datasources
    @@ -57,13 +50,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.listDisclosureSettings returns a list containing the current settings of the nfilters in each study specified.

    -
    -

    Details

    +
    +

    Details

    This function lists out the current values of the eight disclosure filters in each of the data repository servers specified by datasources argument.

    The eight filters are explained below:

    @@ -106,13 +99,13 @@

    Details

    disclosure.

    Server function called: listDisclosureSettingsDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
      
       ## Version 6, for version 5 see Wiki
    @@ -154,23 +147,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.listDisclosureSettings.md b/docs/reference/ds.listDisclosureSettings.md new file mode 100644 index 00000000..b08d1489 --- /dev/null +++ b/docs/reference/ds.listDisclosureSettings.md @@ -0,0 +1,137 @@ +# Lists disclosure settings + +Lists current values for disclosure control filters in all data +repository servers. + +## Usage + +``` r +ds.listDisclosureSettings(datasources = NULL) +``` + +## Arguments + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.listDisclosureSettings` returns a list containing the current +settings of the `nfilters` in each study specified. + +## Details + +This function lists out the current values of the eight disclosure +filters in each of the data repository servers specified by +`datasources` argument. + +The eight filters are explained below: + +\(1\) `nfilter.tab`, the minimum non-zero cell count allowed in any cell +if a contingency table is to be returned. This applies to one +dimensional and two dimensional tables of counts tabulated across one or +two factors and to tables of a mean of a quantitative variable tabulated +across a factor. Default usually set to 3 but a value of 1 (no limit) +may be necessary, particularly if low cell counts are highly probable +such as when working with rare diseases. Five is also a justifiable +choice to replicate the most common threshold rule imposed by data +releasers worldwide, but it should be recognised that many census +providers are moving to ten - but the formal justification of this is +little more than 'it is safer' and everybody is scared of something +going wrong - in practice it is very easy to get around any block and so +it is debatable whether the scientific cost outweighs the imposition of +any threshold. + +\(2\) `nfilter.subset`, the minimum non-zero count of observational +units (typically individuals) in a subset. Typically defaulted to 3. + +\(3\) `nfilter.glm`, the maximum number of parameters in a regression +model as a proportion of the sample size in a study. If a study has 1000 +observational units (typically individuals) being used in a particular +analysis then if `nfilter.glm` is set to 0.33 (its default value) the +maximum allowable number of parameters in a model fitted to those data +will be 330. This disclosure filter protects against fitting overly +saturated models that can be disclosive. The choice of 0.33 is entirely +arbitrary. + +\(4\) `nfilter.string`, the maximum length of a string argument if that +argument is to be subject to testing of its length. Default value 80. +The aim of this `nfilter` is to make it difficult for hackers to find a +way to embed malicious code in a valid string argument that is actively +interpreted. + +\(5\) `nfilter.string`, Short to be used when a string must be specified +but that when valid that string should be short. + +\(6\) `nfilter.kNN` applies to graphical plots based on working with the +k nearest neighbours of each point. `nfilter.kNN` specifies the minimum +allowable value for the number of nearest neighbours used, typically +defaulted to 3. + +\(7\) `nfilter.levels` specifies the maximum number of unique levels of +a factor variable that can be disclosed to the client. In the absence of +this filter a user can convert a numeric variable to a factor and see +its unique levels which are all the distinct values of the numeric +vector. To prevent such disclosure we set this threshold to 0.33 which +ensures that if a factor has unique levels more than the 33 + +\(8\) `nfilter.noise` specifies the minimum level of noise added in some +variables mainly used for data visualizations. The default value is 0.25 +which means that the noise added to a given variable, follows a normal +distribution with zero mean and variance equal to 25 variance of the +given variable. Any value greater than this threshold can reduce the +risk of disclosure. + +Server function called: `listDisclosureSettingsDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Call to list current disclosure settings in all data repository servers + + ds.listDisclosureSettings(datasources = connections) + + # Restrict call to list disclosure settings only to the first, or second DS connection (study) + + ds.listDisclosureSettings(datasources = connections[1]) + ds.listDisclosureSettings(datasources = connections[2]) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.listOpals.html b/docs/reference/ds.listOpals.html index 90f473b7..16df29ff 100644 --- a/docs/reference/ds.listOpals.html +++ b/docs/reference/ds.listOpals.html @@ -1,61 +1,55 @@ -Lists all Opal objects in the analytic environment — ds.listOpals • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    ds.listOpals calls the internal DataSHIELD function getOpals() which identifies all Opal objects in the analytic environment.

    -
    +
    +

    Usage

    ds.listOpals()
    -
    -

    Value

    +
    +

    Value

    Lists all of the sets of Opals currently found in the analytic environment and advises the user how best to respond depending whether there are zero, one or multiple Opals detected.

    -
    -

    Details

    +
    +

    Details

    ds.listOpals calls the internal DataSHIELD function getOpals() which identifies all Opal objects in the analytic environment. If there are no Opal servers in the analytic environment ds.listOpalsIreminds the user that they have to login to a valid set of Opal @@ -67,28 +61,24 @@

    Details

    for each call, or can alternatively use the ds.setDefaultOpals function to specify a default set of Opals to be used by all client-side calls unless over-ruled by the 'datasources=' argument.

    -
    -

    Author

    +
    +

    Author

    Burton, PR. 28/9/16

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.listOpals.md b/docs/reference/ds.listOpals.md new file mode 100644 index 00000000..818cd3f9 --- /dev/null +++ b/docs/reference/ds.listOpals.md @@ -0,0 +1,37 @@ +# Lists all Opal objects in the analytic environment + +ds.listOpals calls the internal DataSHIELD function getOpals() which +identifies all Opal objects in the analytic environment. + +## Usage + +``` r +ds.listOpals() +``` + +## Value + +Lists all of the sets of Opals currently found in the analytic +environment and advises the user how best to respond depending whether +there are zero, one or multiple Opals detected. + +## Details + +ds.listOpals calls the internal DataSHIELD function getOpals() which +identifies all Opal objects in the analytic environment. If there are no +Opal servers in the analytic environment ds.listOpalsIreminds the user +that they have to login to a valid set of Opal login objects, if they +wish to use DataSHIELD. If there is only one set of Opals, ds.listOpals +copies that one set and names the copy 'default.opals'. This default set +will then be used by default by all subsequent calls to client-side +functions. If there is more than one set of Opals in the analytic +environment, ds.listOpals tells the user that they can either explicitly +specify the Opals to be used by each client-side function by providing +an explicit "datasources=" argument for each call, or can alternatively +use the ds.setDefaultOpals function to specify a default set of Opals to +be used by all client-side calls unless over-ruled by the 'datasources=' +argument. + +## Author + +Burton, PR. 28/9/16 diff --git a/docs/reference/ds.listServersideFunctions.html b/docs/reference/ds.listServersideFunctions.html index 1395e31e..b172ac7b 100644 --- a/docs/reference/ds.listServersideFunctions.html +++ b/docs/reference/ds.listServersideFunctions.html @@ -1,54 +1,47 @@ -Lists server-side functions — ds.listServersideFunctions • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Lists all current server-side functions

    -
    +
    +

    Usage

    ds.listServersideFunctions(datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    datasources
    @@ -57,14 +50,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.listServersideFunctions returns to the client-side a list containing all server-side functions separately for each study. Firstly lists assign and then aggregate functions.

    -
    -

    Details

    +
    +

    Details

    Uses datashield.methods function from DSI package to list all assign and aggregate functions on the available data repository servers. The only choice of arguments is in datasources; i.e. which studies to interrogate. @@ -73,13 +66,13 @@

    Details

    of these studies and then all aggregate functions for all of them.

    This function does not call any server-side function.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
      
       ## Version 6, for version 5 see Wiki
    @@ -116,23 +109,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.listServersideFunctions.md b/docs/reference/ds.listServersideFunctions.md new file mode 100644 index 00000000..4b305fce --- /dev/null +++ b/docs/reference/ds.listServersideFunctions.md @@ -0,0 +1,81 @@ +# Lists server-side functions + +Lists all current server-side functions + +## Usage + +``` r +ds.listServersideFunctions(datasources = NULL) +``` + +## Arguments + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.listServersideFunctions` returns to the client-side a list +containing all server-side functions separately for each study. Firstly +lists assign and then aggregate functions. + +## Details + +Uses +[`datashield.methods`](https://datashield.github.io/DSI/reference/datashield.methods.html) +function from `DSI` package to list all assign and aggregate functions +on the available data repository servers. The only choice of arguments +is in `datasources`; i.e. which studies to interrogate. Once the studies +have been selected `ds.listServersideFunctions` lists all assign +functions for all of these studies and then all aggregate functions for +all of them. + +This function does not call any server-side function. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # List server-side functions + + ds.listServersideFunctions(datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.lmerSLMA.html b/docs/reference/ds.lmerSLMA.html index feb1b804..b8ca326a 100644 --- a/docs/reference/ds.lmerSLMA.html +++ b/docs/reference/ds.lmerSLMA.html @@ -1,53 +1,48 @@ -Fits Linear Mixed-Effect model via Study-Level Meta-Analysis — ds.lmerSLMA • dsBaseClientFits Linear Mixed-Effect model via Study-Level Meta-Analysis — ds.lmerSLMA • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    ds.lmerSLMA fits a Linear Mixed-Effects Model (lme) - can include both fixed and random-effects - on data from one or multiple sources with pooling via SLMA (Study-Level Meta-Analysis)

    -
    +
    +

    Usage

    ds.lmerSLMA(
       formula = NULL,
       offset = NULL,
    @@ -67,8 +62,8 @@ 

    Fits Linear Mixed-Effect model via Study-Level Meta-Analysis

    )
    -
    -

    Arguments

    +
    +

    Arguments

    formula
    @@ -160,8 +155,8 @@

    Arguments

    If no <newobj> argument is specified, the output object defaults to "new.lmer.obj".

    -
    -

    Value

    +
    +

    Value

    Many of the elements of the output list returned by ds.lmerSLMA are equivalent to those returned by the lmer() function in native R. However, potentially disclosive elements @@ -214,8 +209,8 @@

    Value

    convergence.error.message: reports for each study whether the model converged. If it did not some information about the reason for this is reported.

    -
    -

    Details

    +
    +

    Details

    ds.lmerSLMA fits a Linear Mixed Effects Model (lme) - can include both fixed and random effects - on data from single or multiple sources.

    This function is similar to lmer function from lme4 package in native R.

    @@ -272,13 +267,13 @@

    Details

    the development team can activate this argument so alternatives can be specified.

    Server function called: lmerSLMADS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see Wiki
    @@ -320,23 +315,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.lmerSLMA.md b/docs/reference/ds.lmerSLMA.md new file mode 100644 index 00000000..042beb65 --- /dev/null +++ b/docs/reference/ds.lmerSLMA.md @@ -0,0 +1,326 @@ +# Fits Linear Mixed-Effect model via Study-Level Meta-Analysis + +`ds.lmerSLMA` fits a Linear Mixed-Effects Model (lme) - can include both +fixed and random-effects - on data from one or multiple sources with +pooling via SLMA (Study-Level Meta-Analysis) + +## Usage + +``` r +ds.lmerSLMA( + formula = NULL, + offset = NULL, + weights = NULL, + combine.with.metafor = TRUE, + dataName = NULL, + checks = FALSE, + datasources = NULL, + REML = TRUE, + control_type = NULL, + control_value = NULL, + optimizer = NULL, + verbose = 0, + notify.of.progress = FALSE, + assign = FALSE, + newobj = NULL +) +``` + +## Arguments + +- formula: + + an object of class formula describing the model to be fitted. For more + information see **Details**. + +- offset: + + a character string specifying the name of a variable to be used as an + offset. + +- weights: + + a character string specifying the name of a variable containing prior + regression weights for the fitting process. + +- combine.with.metafor: + + logical. If TRUE the estimates and standard errors for each regression + coefficient are pooled across studies using random-effects + meta-analysis under maximum likelihood (ML), restricted maximum + likelihood (REML) or fixed-effects meta-analysis (FE). Default TRUE. + +- dataName: + + a character string specifying the name of an (optional) data frame + that contains all of the variables in the LME formula. For more + information see **Details**. + +- checks: + + logical. If TRUE `ds.lmerSLMA` checks the structural integrity of the + model. Default FALSE. For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- REML: + + logical. If TRUE the REstricted Maximum Likelihood (REML) is used for + parameter optimization. If FALSE the parameters are optimized using + standard ML (maximum likelihood). Default TRUE. For more information + see **Details**. + +- control_type: + + an optional character string vector specifying the nature of a + parameter (or parameters) to be modified in the + `convergence control options` which can be viewed or modified via the + `lmerControl` function of the package `lme4`. For more information see + **Details**. + +- control_value: + + numeric representing the new value which you want to allocate the + control parameter corresponding to the `control-type`. For more + information see **Details**. + +- optimizer: + + specifies the parameter optimizer that `lmer` should use. For more + information see **Details**. + +- verbose: + + an integer value. If \\verbose \> 0\\ the output is generated during + the optimization of the parameter estimates. If \\verbose \> 1\\ the + output is generated during the individual penalized iteratively + reweighted least squares (PIRLS) steps. Default `verbose` value is 0 + which means no additional output. + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default FALSE. + +- assign: + + a logical, indicates whether the function will call a second + server-side function (an assign) in order to save the regression + outcomes (i.e. a lmerMod object) on each server. Default FALSE. + +- newobj: + + a character string specifying the name of the object to which the + lmerMod object representing the model fit on the serverside in each + study is to be written. This argument is used only when the argument + `assign` is set to TRUE. If no \ argument is specified, the + output object defaults to "new.lmer.obj". + +## Value + +Many of the elements of the output list returned by `ds.lmerSLMA` are +equivalent to those returned by the `lmer()` function in native R. +However, potentially disclosive elements such as individual-level +residuals and linear predictor values are blocked. In this case, only +non-disclosive elements are returned from each study separately. + +The list of elements returned by `ds.lmerSLMA` is mentioned below: + +`ds.lmerSLMA` returns a list of elements mentioned below separately for +each study. + +`coefficients`: a matrix with 5 columns: + +- First: + + : the names of all of the regression parameters (coefficients) in the + model + +- second: + + : the estimated values + +- third: + + : corresponding standard errors of the estimated values + +- fourth: + + : the ratio of estimate/standard error + +- fifth: + + : the p-value treating that as a standardised normal deviate + +`CorrMatrix`: the correlation matrix of parameter estimates. + +`VarCovMatrix`: the variance-covariance matrix of parameter estimates. + +`weights`: the vector (if any) holding regression weights. + +`offset`: the vector (if any) holding an offset. + +`cov.scaled`: equivalent to `VarCovMatrix`. + +`Nmissing`: the number of missing observations in the given study. + +`Nvalid`: the number of valid (non-missing) observations in the given +study. + +`Ntotal`: the total number of observations in the given study +(`Nvalid` + `Nmissing`). + +`data`: equivalent to input parameter `dataName` (above). + +`call`: summary of key elements of the call to fit the model. + +There are a small number of more esoteric items of the information +returned by `ds.lmerSLMA`. Additional information about these can be +found in the help file for the `lmer()` function in the `lme4` package. + +Once the study-specific output has been returned, the function returns +several elements relating to the pooling of estimates across studies via +study-level meta-analysis. These are as follows: + +`input.beta.matrix.for.SLMA`: a matrix containing the vector of +coefficient estimates from each study. + +`input.se.matrix.for.SLMA`: a matrix containing the vector of standard +error estimates for coefficients from each study. + +`SLMA.pooled.estimates`: a matrix containing pooled estimates for each +regression coefficient across all studies with pooling under SLMA via +random-effects meta-analysis under maximum likelihood (ML), restricted +maximum likelihood (REML) or via fixed-effects meta-analysis (FE). + +`convergence.error.message`: reports for each study whether the model +converged. If it did not some information about the reason for this is +reported. + +## Details + +`ds.lmerSLMA` fits a Linear Mixed Effects Model (lme) - can include both +fixed and random effects - on data from single or multiple sources. + +This function is similar to `lmer` function from `lme4` package in +native R. + +When there are multiple data sources, the LME is fitted to convergence +in each data source independently. The estimates and standard errors +returned to the client-side which enable cross-study pooling using +Study-Level Meta-Analysis (SLMA). The SLMA used by default `metafor` +package but as the SLMA occurs on the client-side (a standard R +environment), the user can choose any approach to meta-analysis. +Additional information about fitting LMEs using the `lmer` function can +be obtained using R help for `lmer` and the `lme4` package. + +In `formula` most shortcut notation allowed by `lmer()` function is also +allowed by `ds.lmerSLMA`. Many LMEs can be fitted very simply using a +formula like: \\y ~ a + b + (1 \| c)\\ which simply means fit an LME +with `y` as the outcome variable with `a` and `b` as fixed effects, and +`c` as a random effect or grouping factor. + +It is also possible to fit models with random slopes by specifying a +model such as \\y ~ a + b + (1 + b \| c)\\ where the effect of `b` can +vary randomly between groups defined by `c`. Implicit nesting can be +specified with formulae such as \\y ~ a + b + (1 \| c / d)\\ or \\y ~ +a + b + (1 \| c) + (1 \| c : d)\\. + +The `dataName` argument avoids you having to specify the name of the +data frame in front of each covariate in the formula. For example, if +the data frame is called `DataFrame` you avoid having to write: +\\DataFrame\\y ~ DataFrame\\a + DataFrame\\b + (1 \| DataFrame\\c)\\. + +The `checks` argument verifies that the variables in the model are all +defined (exist) on the server-site at every study and that they have the +correct characteristics required to fit the model. It is suggested to +make `checks` argument TRUE if an unexplained problem in the model fit +is encountered because the running process takes several minutes. + +`REML` can help to mitigate bias associated with the fixed-effects. See +help on the `lmer()` function for more details. + +In `control_type` at present only one such parameter can be modified, +namely the tolerance of the convergence criterion to the gradient of the +log-likelihood at the maximum likelihood achieved. We have enabled this +because our practical experience suggests that in situations where the +model looks to have converged with sensible parameter values but formal +convergence is not being declared if we allow the model to be more +tolerant to a non-zero gradient the same parameter values are obtained +but formal convergence is declared. The default value for the +`check.conv.grad` is `0.002`. + +`control_value` At present (see `control_type`) the only parameter this +can be is the convergence tolerance `check.conv.grad`. In general, +models will be identified as having converged more readily if the value +set for `check.conv.grad` is increased from its default (`0.002`). +Please note that the risk of doing this is that the model is also more +likely to be declared as having converged at a local maximum that is not +the global maximum likelihood. This will not generally be a problem if +the likelihood surface is well behaved but if you have a problem with +convergence you might usefully compare all the parameter estimates and +standard errors obtained using the default tolerance (`0.002`) even +though that has not formally converged with those obtained after +convergence using the higher tolerance. + +The `optimizer` argument is built in but it won't do anything because +there is only one standard optimizer available for lmer - this is the +`nloptwrap` optimizer. If users wish to apply a different optimizer - +potentially one they have developed themselves - the development team +can activate this argument so alternatives can be specified. + +Server function called: `lmerSLMADS2` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CLUSTER.CLUSTER_SLO1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CLUSTER.CLUSTER_SLO2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CLUSTER.CLUSTER_SLO3", driver = "OpalDriver") + logindata <- builder$build() + + #Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Select all rows without missing values + ds.completeCases(x1 = "D", newobj = "D.comp", datasources = connections) + + # Fit the lmer + + ds.lmerSLMA(formula = "BMI ~ incid_rate + diabetes + (1 | Male)", + dataName = "D.comp", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } +``` diff --git a/docs/reference/ds.log.html b/docs/reference/ds.log.html index 702c219b..52f4d52d 100644 --- a/docs/reference/ds.log.html +++ b/docs/reference/ds.log.html @@ -1,56 +1,50 @@ -Computes logarithms in the server-side — ds.log • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Computes the logarithms for a specified numeric vector. This function is similar to the R log function. by default natural logarithms.

    -
    +
    +

    Usage

    ds.log(x = NULL, base = exp(1), newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -73,22 +67,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.log returns a vector for each study of the transformed values for the numeric vector specified in the argument x. The created vectors are stored in the server-side.

    -
    -

    Details

    -

    Server function called: log

    +
    +

    Details

    +

    Server function called: logDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki 
    @@ -130,23 +125,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.log.md b/docs/reference/ds.log.md new file mode 100644 index 00000000..99427043 --- /dev/null +++ b/docs/reference/ds.log.md @@ -0,0 +1,93 @@ +# Computes logarithms in the server-side + +Computes the logarithms for a specified numeric vector. This function is +similar to the R `log` function. by default natural logarithms. + +## Usage + +``` r +ds.log(x = NULL, base = exp(1), newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of a numerical vector. + +- base: + + a positive number, the base for which logarithms are computed. Default + `exp(1)`. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the server-side. Default `log.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.log` returns a vector for each study of the transformed values for +the numeric vector specified in the argument `x`. The created vectors +are stored in the server-side. + +## Details + +Server function called: `logDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Calculating the log value of the 'PM_BMI_CONTINUOUS' variable + + ds.log(x = "D$PM_BMI_CONTINUOUS", + base = exp(2), + newobj = "log.PM_BMI_CONTINUOUS", + datasources = connections[1]) #only the first Opal server is used (study1) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.look.html b/docs/reference/ds.look.html index 68d0fbde..f44282b3 100644 --- a/docs/reference/ds.look.html +++ b/docs/reference/ds.look.html @@ -1,56 +1,50 @@ -Performs direct call to a server-side aggregate function — ds.look • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function ds.look can be used to make a direct call to a server-side aggregate function more simply than using the datashield.aggregate function.

    -
    +
    +

    Usage

    ds.look(toAggregate = NULL, checks = FALSE, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    toAggregate
    @@ -69,12 +63,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    the output from the specified server-side aggregate function to the client-side.

    -
    -

    Details

    +
    +

    Details

    The ds.look and datashield.aggregate functions are generally only recommended for experienced developers. For example, the toAggregate argument has to be expressed in the same form that the server-side function would usually expect from its @@ -88,13 +82,13 @@

    Details

    and less error-prone to call a server-side function using its client-side pair.

    The function is a wrapper for the DSI package function datashield.aggregate.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -139,23 +133,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.look.md b/docs/reference/ds.look.md new file mode 100644 index 00000000..86e9f3a2 --- /dev/null +++ b/docs/reference/ds.look.md @@ -0,0 +1,107 @@ +# Performs direct call to a server-side aggregate function + +The function `ds.look` can be used to make a direct call to a +server-side aggregate function more simply than using the +`datashield.aggregate` function. + +## Usage + +``` r +ds.look(toAggregate = NULL, checks = FALSE, datasources = NULL) +``` + +## Arguments + +- toAggregate: + + a character string specifying the function call to be made. For more + information see **Details**. + +- checks: + + logical. If TRUE the optional checks are undertaken. Default FALSE to + save time. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +the output from the specified server-side aggregate function to the +client-side. + +## Details + +The `ds.look` and `datashield.aggregate` functions are generally only +recommended for experienced developers. For example, the `toAggregate` +argument has to be expressed in the same form that the server-side +function would usually expect from its client-side pair. For example: +`ds.look("table1DDS(female)")` works. But, if you express this as +`ds.look("table1DDS('female')")` it won't work because although when you +call this same function using its client-side function you write +`ds.table1D('female')` the inverted commas are stripped off during +processing by the client-side function so the call to the server-side +does not contain inverted commas. + +Apart from during development work (e.g. before a client-side function +has been written) it is almost always easier and less error-prone to +call a server-side function using its client-side pair. + +The function is a wrapper for the DSI package function +`datashield.aggregate`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Calculate the length of a variable using the server-side function + + ds.look(toAggregate = "lengthDS(D$age.60)", + checks = FALSE, + datasources = connections) + + #Calculate the column names of "D" object using the server-side function + + ds.look(toAggregate = "colnames(D)", + checks = FALSE, + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.ls.html b/docs/reference/ds.ls.html index 2413c685..b9b7f886 100644 --- a/docs/reference/ds.ls.html +++ b/docs/reference/ds.ls.html @@ -1,51 +1,45 @@ -lists all objects on a server-side environment — ds.ls • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    creates a list of the names of all of the objects in a specified serverside environment.

    -
    +
    +

    Usage

    ds.ls(
       search.filter = NULL,
       env.to.search = 1L,
    @@ -54,8 +48,8 @@ 

    lists all objects on a server-side environment

    )
    -
    -

    Arguments

    +
    +

    Arguments

    search.filter
    @@ -84,8 +78,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.ls returns to the client-side a list containing:
    (1) the name/details of the server-side R environment which ds.ls has searched;
    (2) a vector of character strings giving the names of @@ -93,8 +87,8 @@

    Value

    specified R server-side environment;
    (3) the nature of the search filter string as it was applied.

    -
    -

    Details

    +
    +

    Details

    When running analyses one may want to know the objects already generated. This request is not disclosive as it only returns the names of the objects and not their contents.

    By default, objects in DataSHIELD's Active Serverside Analytic Environment (.GlobalEnv) @@ -128,13 +122,14 @@

    Details

    all objects in the specified environment will be returned.

    Server function called: lsDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -190,23 +185,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.ls.md b/docs/reference/ds.ls.md new file mode 100644 index 00000000..6e924769 --- /dev/null +++ b/docs/reference/ds.ls.md @@ -0,0 +1,165 @@ +# lists all objects on a server-side environment + +creates a list of the names of all of the objects in a specified +serverside environment. + +## Usage + +``` r +ds.ls( + search.filter = NULL, + env.to.search = 1L, + search.GlobalEnv = TRUE, + datasources = NULL +) +``` + +## Arguments + +- search.filter: + + character string (potentially including `*` symbol) specifying the + filter for the object name that you want to find in the environment. + For more information see **Details**. + +- env.to.search: + + an integer (e.g. in `2` or `2L` format) specifying the position in the + search path of the environment to be explored. `1L` is the current + active analytic environment on the server-side and is the default + value of `env.to.search`. For more information see **Details**. + +- search.GlobalEnv: + + Logical. If TRUE, `ds.ls` will list all objects in the `.GlobalEnv` R + environment on the server-side. If FALSE and if `env.to.search` is + also set as a valid integer, `ds.ls` will list all objects in the + server-side R environment identified by `env.to.search` in the search + path. For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.ls` returns to the client-side a list containing: +(1) the name/details of the server-side R environment which `ds.ls` has +searched; +(2) a vector of character strings giving the names of all objects +meeting the naming criteria specified by the argument `search.filter` in +this specified R server-side environment; +(3) the nature of the search filter string as it was applied. + +## Details + +When running analyses one may want to know the objects already +generated. This request is not disclosive as it only returns the names +of the objects and not their contents. + +By default, objects in DataSHIELD's Active Serverside Analytic +Environment (`.GlobalEnv`) will be listed. This is the environment that +contains all of the objects that server-side DataSHIELD is using for the +main analysis or has written out to the server-side during the process +of managing or undertaking the analysis (variables, scalars, matrices, +data frames, etc). + +The environment to explore is specified by the argument `env.to.search` +(i.e. environment to search) to an integer value. The default +environment which R names as `.GlobalEnv` is set by specifying +`env.to.search = 1` or `1L` (`1L` is just an explicit way of writing the +integer `1`). + +If the `search.GlobalEnv` argument is set to TRUE the `env.to.search` +parameter is set to `1L` regardless of what value it is set in the call +or if it is set to NULL. So, if `search.GlobalEnv` is set to TRUE, +`ds.ls` will automatically search the `.GlobalEnv` R environment on the +server-side which contains all of the variables, data frames and other +objects read in at the start of the analysis, as well as any new objects +of any sort created using DataSHIELD assign functions. + +Other server-side environments contain other objects. For example, +environment `2L` contains the functions loaded via the native R stats +package and `6L` contains the standard list of datasets built into R. By +default `ds.ls` will return a list of ALL of the objects in the +environment specified by the `env.to.search` argument but you can +specify search filters including `*` wildcards using the `search.filter` +argument. + +In `search.filter` you can use the symbol `*` to find all the object +that contains the specified characters. For example, +`search.filter = "Sd2*"` will list the names of all objects in the +specified environment with names beginning capital S, lower case d and +number 2. Similarly, `search.filter="*.ID"` will return all objects with +names ending with `.ID`, for example `Study.ID`. If a value is not +specified for the `search.filter` argument or it is set as NULL, the +names of all objects in the specified environment will be returned. + +Server function called: `lsDS`. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Example 1: Obtain the list of all objects on a server-side environment + + ds.ls(datasources = connections) + + #Example 2: Obtain the list of all objects that contain "var" character in the name + #Create in the server-side variables with "var" character in the name + + ds.assign(toAssign = "D$LAB_TSC", + newobj = "var.LAB_TSC", + datasources = connections) + ds.assign(toAssign = "D$LAB_TRIG", + newobj = "var.LAB_TRIG", + datasources = connections) + ds.assign(toAssign = "D$LAB_HDL", + newobj = "var.LAB_HDL", + datasources = connections) + + ds.ls(search.filter = "var*", + env.to.search = 1L, + search.GlobalEnv = TRUE, + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.lspline.html b/docs/reference/ds.lspline.html index 98609889..0d0e0fd5 100644 --- a/docs/reference/ds.lspline.html +++ b/docs/reference/ds.lspline.html @@ -1,55 +1,51 @@ -Basis for a piecewise linear spline with meaningful coefficients — ds.lspline • dsBaseClientBasis for a piecewise linear spline with meaningful coefficients — ds.lspline • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is based on the native R function lspline from the lspline package. This function computes the basis of piecewise-linear spline such that, depending on the argument marginal, the coefficients can be interpreted as (1) slopes of consecutive spline segments, or (2) slope change at consecutive knots.

    -
    +
    +

    Usage

    ds.lspline(
       x,
       knots = NULL,
    @@ -60,8 +56,8 @@ 

    Basis for a piecewise linear spline with meaningful coefficients

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -91,40 +87,36 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    an object of class "lspline" and "matrix", which its name is specified by the newobj argument (or its default name "lspline.newobj"), is assigned on the serverside.

    -
    -

    Details

    +
    +

    Details

    If marginal is FALSE (default) the coefficients of the spline correspond to slopes of the consecutive segments. If it is TRUE the first coefficient correspond to the slope of the first segment. The consecutive coefficients correspond to the change in slope as compared to the previous segment.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.lspline.md b/docs/reference/ds.lspline.md new file mode 100644 index 00000000..105c31ac --- /dev/null +++ b/docs/reference/ds.lspline.md @@ -0,0 +1,69 @@ +# Basis for a piecewise linear spline with meaningful coefficients + +This function is based on the native R function `lspline` from the +`lspline` package. This function computes the basis of piecewise-linear +spline such that, depending on the argument marginal, the coefficients +can be interpreted as (1) slopes of consecutive spline segments, or (2) +slope change at consecutive knots. + +## Usage + +``` r +ds.lspline( + x, + knots = NULL, + marginal = FALSE, + names = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + the name of the input numeric variable + +- knots: + + numeric vector of knot positions + +- marginal: + + logical, how to parametrise the spline, see Details + +- names: + + character, vector of names for constructed variables + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `lspline.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +an object of class "lspline" and "matrix", which its name is specified +by the `newobj` argument (or its default name "lspline.newobj"), is +assigned on the serverside. + +## Details + +If marginal is FALSE (default) the coefficients of the spline correspond +to slopes of the consecutive segments. If it is TRUE the first +coefficient correspond to the slope of the first segment. The +consecutive coefficients correspond to the change in slope as compared +to the previous segment. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.make.html b/docs/reference/ds.make.html index 38bd3b25..fb7ae8e0 100644 --- a/docs/reference/ds.make.html +++ b/docs/reference/ds.make.html @@ -1,58 +1,53 @@ -Calculates a new object in the server-side — ds.make • dsBaseClientCalculates a new object in the server-side — ds.make • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function defines a new object in the server-side via an allowed function or an arithmetic expression.

    ds.make function is equivalent to ds.assign, but runs slightly faster.

    -
    +
    +

    Usage

    ds.make(toAssign = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    toAssign
    @@ -70,14 +65,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.make returns the new object which is written to the server-side. Also a validity message is returned to the client-side indicating whether the new object has been correctly created at each source.

    -
    -

    Details

    +
    +

    Details

    If the new object is created successfully, the function will verify its existence on the required servers. Please note there are certain modes of failure where it is reported that the object has been created but it is not there. This @@ -125,13 +120,13 @@

    Details

    Server function : messageDS

    The ds.make function is a wrapper for the DSI package function datashield.assign

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -193,23 +188,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.make.md b/docs/reference/ds.make.md new file mode 100644 index 00000000..1c896d0f --- /dev/null +++ b/docs/reference/ds.make.md @@ -0,0 +1,168 @@ +# Calculates a new object in the server-side + +This function defines a new object in the server-side via an allowed +function or an arithmetic expression. + +`ds.make` function is equivalent to `ds.assign`, but runs slightly +faster. + +## Usage + +``` r +ds.make(toAssign = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- toAssign: + + a character string specifying the function or the arithmetic + expression. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `make.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.make` returns the new object which is written to the server-side. +Also a validity message is returned to the client-side indicating +whether the new object has been correctly created at each source. + +## Details + +If the new object is created successfully, the function will verify its +existence on the required servers. Please note there are certain modes +of failure where it is reported that the object has been created but it +is not there. This reflects a failure in the processing of some sort and +warrants further exploration of the details of the call to `ds.make` and +the variables/objects which it invokes. + +TROUBLESHOOTING: please note we have recently identified an error that +makes `ds.make` fail and DataSHIELD crash. + +The error arises from a call such as +`ds.make(toAssign = '5.3 + beta*xvar', newobj = 'predvals')`. This is a +typical call you may make to get the predicted values from a simple +linear regression model where a `y` variable is regressed against an `x` +variable (`xvar`) where the estimated regression intercept is `5.3` and +`beta` is the estimated regression slope. + +This call appears to fail because in interpreting the arithmetic +function which is its first argument it first encounters the (length 1) +scalar `5.3` and when it then encounters the `xvar` vector which has +more than one element it fails - apparently because it does not +recognise that you need to replicate the `5.3` value the appropriate +number of times to create a vector of length equal to `xvar` with each +value equal to `5.3`. + +There are two work-around solutions here: + +\(1\) explicitly create a vector of appropriate length with each value +equal to `5.3`. To do this there is a useful trick. First identify a +convenient numeric variable with no missing values (typically a numeric +individual ID) let us call it `indID` equal in length to `xvar` (`xvar` +may include NAs but that doesn't matter provided `indID` is the same +total length). Then issue the call +`ds.make(toAssign = 'indID-indID+1',newobj = 'ONES')`. This creates a +vector of ones (called `ONES`) in each source equal in length to the +`indID` vector in that source. Then issue the second call +`ds.make(toAssign = 'ONES*5.3',newobj = 'vect5.3')` which creates the +required vector of length equal to `xvar` with all elements `5.3`. +Finally, you can now issue a modified call to reflect what was +originally needed: +`ds.make(toAssign = 'vect5.3+beta*xvar', 'predvals')`. + +\(2\) Alternatively, if you simply swap the original call around: +`ds.make(toAssign = '(beta*xvar)+5.3', newobj = 'predvals')` the error +seems also to be circumvented. This is presumably because the first +element of the arithmetic function is of length equal to `xvar` and it +then knows to replicate the `5.3` that many times in the second part of +the expression. + +The second work-around is easier, but it is worth knowing about the +first trick because creating a vector of ones of equal length to another +vector can be useful in other settings. Equally the call: +`ds.make(toAssign = 'indID-indID',newobj = 'ZEROS')` to create a vector +of zeros of that same length may also be useful. + +Server function : `messageDS` + +The `ds.make` function is a wrapper for the DSI package function +`datashield.assign` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + +##Example 1: arithmetic operators + +ds.make(toAssign = "D$age.60 + D$bmi.26", + newobj = "exprs1", + datasources = connections) + +ds.make(toAssign = "D$noise.56 + D$pm10.16", + newobj = "exprs2", + datasources = connections) + +ds.make(toAssign = "(exprs1*exprs2)/3.2", + newobj = "result.example1", + datasources = connections) + +##Example 2: miscellaneous operators within functions + +ds.make(toAssign = "(D$female)^2", + newobj = "female2", + datasources = connections) + +ds.make(toAssign = "(2*D$female)+(D$log.surv)-(female2*2)", + newobj = "output.test.1", + datasources = connections) + +ds.make(toAssign = "exp(output.test.1)", + newobj = "output.test", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrix.html b/docs/reference/ds.matrix.html index 689d88da..ffb98cd3 100644 --- a/docs/reference/ds.matrix.html +++ b/docs/reference/ds.matrix.html @@ -1,55 +1,51 @@ -Creates a matrix on the server-side — ds.matrix • dsBaseClientCreates a matrix on the server-side — ds.matrix • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Creates a matrix on the server-side with dimensions specified by nrows.scalar and ncols.scalar arguments and assigns the values of all its elements based on the mdata argument.

    -
    +
    +

    Usage

    ds.matrix(
       mdata = NA,
       from = "clientside.scalar",
    @@ -62,8 +58,8 @@ 

    Creates a matrix on the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    mdata
    @@ -113,15 +109,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrix returns the created matrix which is written on the server-side. In addition, two validity messages are returned indicating whether the new matrix has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the R native function matrix().

    If in the mdata argument a vector is specified this should have the same length as the total number of elements @@ -141,13 +137,13 @@

    Details

    Server function called: matrixDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -238,23 +234,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrix.md b/docs/reference/ds.matrix.md new file mode 100644 index 00000000..f1d1bd1f --- /dev/null +++ b/docs/reference/ds.matrix.md @@ -0,0 +1,193 @@ +# Creates a matrix on the server-side + +Creates a matrix on the server-side with dimensions specified by +`nrows.scalar` and `ncols.scalar` arguments and assigns the values of +all its elements based on the `mdata` argument. + +## Usage + +``` r +ds.matrix( + mdata = NA, + from = "clientside.scalar", + nrows.scalar = NULL, + ncols.scalar = NULL, + byrow = FALSE, + dimnames = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- mdata: + + a character string specifying the name of a server-side scalar or + vector. Also, a numeric value representing a scalar specified from the + client-side can be specified Zeros, negative values and NAs are all + allowed. For more information see **Details**. + +- from: + + a character string specifying the source and nature of `mdata`. This + can be set as `"serverside.vector"`, `"serverside.scalar"` or + `"clientside.scalar"`. Default `"clientside.scalar"`. + +- nrows.scalar: + + an integer or a character string that specifies the number of rows in + the matrix to be created. For more information see **Details**. + +- ncols.scalar: + + an integer or a character string that specifies the number of columns + in the matrix to be created. + +- byrow: + + logical. If TRUE and `mdata` is a vector the matrix created should be + filled row by row. If FALSE the matrix created should be filled column + by column. Default = FALSE. + +- dimnames: + + a list of length 2 giving the row and column names respectively. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrix.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrix` returns the created matrix which is written on the +server-side. In addition, two validity messages are returned indicating +whether the new matrix has been created in each data source and if so +whether it is in a valid form. + +## Details + +This function is similar to the R native function +[`matrix()`](https://rdrr.io/r/base/matrix.html). + +If in the `mdata` argument a vector is specified this should have the +same length as the total number of elements in the matrix. If this is +not TRUE the values in `mdata` will be used repeatedly until all +elements in the matrix are full. If `mdata` argument is a scalar, all +elements in the matrix will take that value. + +In the `nrows.scalar` argument can be a character string specifying the +name of a server-side scalar. For example, if a server-side scalar named +`ss.scalar` exists and holds the value 23, then by specifying +`nrows.scalar = "ss.scalar"`, the matrix created will have 23 rows. Also +this argument can be a numeric value from the client-side. The same +rules are applied to `ncols.scalar` argument but in this case the column +numbers are specified. In both arguments a zero, negative, NULL or +missing value is not permitted. + +Server function called: `matrixDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Example 1: create a matrix with -13 value in all elements + + ds.matrix(mdata = -13, + from = "clientside.scalar", + nrows.scalar = 3, + ncols.scalar = 8, + newobj = "cs.block", + datasources = connections) + + #Example 2: create a matrix of missing values + + ds.matrix(NA, + from = "clientside.scalar", + nrows.scalar = 4, + ncols.scalar = 5, + newobj = "cs.block.NA", + datasources = connections) + + #Example 3: create a matrix using a server-side vector + #create a vector in the server-side + + ds.rUnif(samp.size = 45, + min = -10.5, + max = 10.5, + newobj = "ss.vector", + seed.as.integer = 8321, + force.output.to.k.decimal.places = 0, + datasources = connections) + + ds.matrix(mdata = "ss.vector", + from = "serverside.vector", + nrows.scalar = 5, + ncols.scalar = 9, + newobj = "sv.block", + datasources = connections) + + #Example 4: create a matrix using a server-side vector and specifying + #the row a column names + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + ds.matrix(mdata = "ss.vector.9", + from = "serverside.vector", + nrows.scalar = 5, + ncols.scalar = 9, + byrow = TRUE, + dimnames = list(c("a","b","c","d","e")), + newobj = "sv.block.9.dimnames1", + datasources = connections) + + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrixDet.html b/docs/reference/ds.matrixDet.html index fd12e5cc..34e32d45 100644 --- a/docs/reference/ds.matrixDet.html +++ b/docs/reference/ds.matrixDet.html @@ -1,60 +1,56 @@ -Calculates de determinant of a matrix in the server-side — ds.matrixDet • dsBaseClientCalculates de determinant of a matrix in the server-side — ds.matrixDet • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Calculates the determinant of a square matrix that is written on the server-side. This operation is only possible if the number of columns and rows of the matrix are the same.

    -
    +
    +

    Usage

    ds.matrixDet(M1 = NULL, newobj = NULL, logarithm = FALSE, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    M1
    @@ -77,27 +73,27 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixDet returns the determinant of an existing matrix on the server-side. The created new object is stored on the server-side. Also, two validity messages are returned indicating whether the matrix has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    Calculates the determinant of a square matrix on the server-side. This function is similar to the native R determinant function.

    Server function called: matrixDetDS2

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -156,23 +152,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixDet.md b/docs/reference/ds.matrixDet.md new file mode 100644 index 00000000..40ebccc2 --- /dev/null +++ b/docs/reference/ds.matrixDet.md @@ -0,0 +1,115 @@ +# Calculates de determinant of a matrix in the server-side + +Calculates the determinant of a square matrix that is written on the +server-side. This operation is only possible if the number of columns +and rows of the matrix are the same. + +## Usage + +``` r +ds.matrixDet(M1 = NULL, newobj = NULL, logarithm = FALSE, datasources = NULL) +``` + +## Arguments + +- M1: + + a character string specifying the name of the matrix. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrixdet.newobj`. + +- logarithm: + + logical. If TRUE the logarithm of the modulus of the determinant is + calculated. Default FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixDet` returns the determinant of an existing matrix on the +server-side. The created new object is stored on the server-side. Also, +two validity messages are returned indicating whether the matrix has +been created in each data source and if so whether it is in a valid +form. + +## Details + +Calculates the determinant of a square matrix on the server-side. This +function is similar to the native R `determinant` function. + +Server function called: `matrixDetDS2` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create the matrix in the server-side + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + ds.matrix(mdata = "ss.vector.9", + from = "serverside.vector", + nrows.scalar = 9,ncols.scalar = 9, + byrow = TRUE, + newobj = "matrix", + datasources = connections) + + #Calculate the determinant of the matrix + + ds.matrixDet(M1 = "matrix", + newobj = "matrixDet", + logarithm = FALSE, + datasources = connections) + + + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrixDet.report.html b/docs/reference/ds.matrixDet.report.html index a72b9191..5ae4d05c 100644 --- a/docs/reference/ds.matrixDet.report.html +++ b/docs/reference/ds.matrixDet.report.html @@ -1,56 +1,50 @@ -Returns matrix determinant to the client-side — ds.matrixDet.report • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Calculates the determinant of a square matrix and returns the result to the client-side

    -
    +
    +

    Usage

    ds.matrixDet.report(M1 = NULL, logarithm = FALSE, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    M1
    @@ -68,13 +62,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixDet.report returns to the client-side the determinant of a matrix that is stored on the server-side.

    -
    -

    Details

    +
    +

    Details

    Calculates and returns to the client-side the determinant of a square matrix on the server-side. This function is similar to the native R determinant function. @@ -82,13 +76,13 @@

    Details

    possible if the number of columns and rows of the matrix are the same.

    Server function called: matrixDetDS1

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -144,23 +138,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixDet.report.md b/docs/reference/ds.matrixDet.report.md new file mode 100644 index 00000000..79d1ed5a --- /dev/null +++ b/docs/reference/ds.matrixDet.report.md @@ -0,0 +1,105 @@ +# Returns matrix determinant to the client-side + +Calculates the determinant of a square matrix and returns the result to +the client-side + +## Usage + +``` r +ds.matrixDet.report(M1 = NULL, logarithm = FALSE, datasources = NULL) +``` + +## Arguments + +- M1: + + a character string specifying the name of the matrix. + +- logarithm: + + logical. If TRUE the logarithm of the modulus of the determinant is + calculated. Default FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixDet.report` returns to the client-side the determinant of a +matrix that is stored on the server-side. + +## Details + +Calculates and returns to the client-side the determinant of a square +matrix on the server-side. This function is similar to the native R +`determinant` function. This operation is only possible if the number of +columns and rows of the matrix are the same. + +Server function called: `matrixDetDS1` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create the matrix in the server-side + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + ds.matrix(mdata = "ss.vector.9", + from = "serverside.vector", + nrows.scalar = 9,ncols.scalar = 9, + byrow = TRUE, + newobj = "matrix", + datasources = connections) + + #Calculate the determinant of the matrix + + ds.matrixDet.report(M1 = "matrix", + logarithm = FALSE, + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrixDiag.html b/docs/reference/ds.matrixDiag.html index 4842f2af..f1eb257e 100644 --- a/docs/reference/ds.matrixDiag.html +++ b/docs/reference/ds.matrixDiag.html @@ -1,53 +1,48 @@ -Calculates matrix diagonals in the server-side — ds.matrixDiag • dsBaseClientCalculates matrix diagonals in the server-side — ds.matrixDiag • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Extracts the diagonal vector from a square matrix or creates a diagonal matrix based on a vector or a scalar value on the server-side.

    -
    +
    +

    Usage

    ds.matrixDiag(
       x1 = NULL,
       aim = NULL,
    @@ -57,8 +52,8 @@ 

    Calculates matrix diagonals in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x1
    @@ -97,15 +92,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixDiag returns to the server-side the square matrix diagonal. Also, two validity messages are returned indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    The function behaviour is different depending on the value specified in the aim argument:
    (1) If aim = "serverside.vector.2.matrix" @@ -138,32 +133,28 @@

    Details

    18 rows and 18 columns will be created.

    Server function called: matrixDiagDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixDiag.md b/docs/reference/ds.matrixDiag.md new file mode 100644 index 00000000..f8d0aa0a --- /dev/null +++ b/docs/reference/ds.matrixDiag.md @@ -0,0 +1,101 @@ +# Calculates matrix diagonals in the server-side + +Extracts the diagonal vector from a square matrix or creates a diagonal +matrix based on a vector or a scalar value on the server-side. + +## Usage + +``` r +ds.matrixDiag( + x1 = NULL, + aim = NULL, + nrows.scalar = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x1: + + a character string specifying the name of a server-side scalar or + vector. Also, a numeric value or vector specified from the client-side + can be specified. This argument depends on the value specified in + `aim`. For more information see **Details**. + +- aim: + + a character string specifying the behaviour of the function. This can + be set as: `"serverside.vector.2.matrix"`, + `"serverside.scalar.2.matrix"`, `"serverside.matrix.2.vector"`, + `"clientside.vector.2.matrix"` or `"clientside.scalar.2.matrix"`. For + more information see **Details**. + +- nrows.scalar: + + an integer specifying the dimensions of the matrix note that the + matrix is square (same number of rows and columns). If this argument + is not specified the matrix dimensions are defined by the length of + the vector. For more information see **Details**. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrixdiag.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixDiag` returns to the server-side the square matrix diagonal. +Also, two validity messages are returned indicating whether the new +object has been created in each data source and if so whether it is in a +valid form. + +## Details + +The function behaviour is different depending on the value specified in +the `aim` argument: +(1) `If aim = "serverside.vector.2.matrix"` the function takes a +server-side vector and writes out a square matrix with the vector as its +diagonal and all off-diagonal `values = 0`. The dimensions of the output +matrix are determined by the length of the vector. If the vector length +is `k`, the output matrix has `k` rows and `k` columns. +(2) If `aim = "serverside.scalar.2.matrix"` the function takes a +server-side scalar and writes out a square matrix with all diagonal +values equal to the value of the scalar and all off-diagonal +`values = 0`. The dimensions of the square matrix are determined by the +value of the `nrows.scalar` argument. +(3) If `aim = "serverside.matrix.2.vector"` the function takes a square +server-side matrix and extracts its diagonal values as a vector which is +written to the server-side. +(4) If `aim = "clientside.vector.2.matrix"` the function takes a vector +specified on the client-side and writes out a square matrix to the +server-side with the vector as its diagonal and all off-diagonal +`values = 0`. The dimensions of the output matrix are determined by the +length of the vector. +(5) If `aim = "clientside.scalar.2.matrix"` the function takes a scalar +specified on the client-side and writes out a square matrix with all +diagonal values equal to the value of the scalar. The dimensions of the +square matrix are determined by the value of the `nrows.scalar` +argument. + +If `x1` is a vector and the `nrows.scalar` is set as `k`, the vector +will be used repeatedly to fill up the diagonal. For example, the vector +is of length 7 and `nrows.scalar = 18`, a square diagonal matrix with 18 +rows and 18 columns will be created. + +Server function called: `matrixDiagDS` + +## Author + +DataSHIELD Development Team + +## Examples diff --git a/docs/reference/ds.matrixDimnames.html b/docs/reference/ds.matrixDimnames.html index 0d52dc68..a5d91db1 100644 --- a/docs/reference/ds.matrixDimnames.html +++ b/docs/reference/ds.matrixDimnames.html @@ -1,51 +1,45 @@ -Specifies the dimnames of the server-side matrix — ds.matrixDimnames • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Adds the row names, the column names or both to a matrix on the server-side.

    -
    +
    +

    Usage

    ds.matrixDimnames(
       M1 = NULL,
       dimnames = NULL,
    @@ -54,8 +48,8 @@ 

    Specifies the dimnames of the server-side matrix

    )
    -
    -

    Arguments

    +
    +

    Arguments

    M1
    @@ -80,26 +74,26 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixDimnames returns to the server-side the matrix with specified row and column names. Also, two validity messages are returned to the client-side indicating the new object that has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the native R dimnames function.

    Server function called: matrixDimnamesDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -162,23 +156,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixDimnames.md b/docs/reference/ds.matrixDimnames.md new file mode 100644 index 00000000..704bd438 --- /dev/null +++ b/docs/reference/ds.matrixDimnames.md @@ -0,0 +1,121 @@ +# Specifies the dimnames of the server-side matrix + +Adds the row names, the column names or both to a matrix on the +server-side. + +## Usage + +``` r +ds.matrixDimnames( + M1 = NULL, + dimnames = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- M1: + + a character string specifying the name of a server-side matrix. + +- dimnames: + + a list of length 2 giving the row and column names respectively. An + empty list is treated as NULL. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrixdimnames.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixDimnames` returns to the server-side the matrix with specified +row and column names. Also, two validity messages are returned to the +client-side indicating the new object that has been created in each data +source and if so whether it is in a valid form. + +## Details + +This function is similar to the native R `dimnames` function. + +Server function called: `matrixDimnamesDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + + #Example 1: Set the row and column names of a server-side matrix + + #Create the server-side vector + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + #Create the server-side matrix + + ds.matrix(mdata = "ss.vector.9", + from = "serverside.vector", + nrows.scalar = 3, + ncols.scalar = 4, + byrow = TRUE, + newobj = "matrix", + datasources = connections) + + #Specify the column and row names of the matrix + + ds.matrixDimnames(M1 = "matrix", + dimnames = list(c("a","b","c"),c("a","b","c","d")), + newobj = "matrix.dimnames", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrixInvert.html b/docs/reference/ds.matrixInvert.html index ef812dc0..5a6c2650 100644 --- a/docs/reference/ds.matrixInvert.html +++ b/docs/reference/ds.matrixInvert.html @@ -1,54 +1,47 @@ -Inverts a server-side square matrix — ds.matrixInvert • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Inverts a square matrix and writes the output to the server-side

    -
    +
    +

    Usage

    ds.matrixInvert(M1 = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    M1
    @@ -67,27 +60,27 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixInvert returns to the server-side the inverts square matrix. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This operation is only possible if the number of columns and rows of the matrix are the same and it is non-singular-positive definite (e.g. there is no row or column that is all zeros).

    Server function called: matrixInvertDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -149,23 +142,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixInvert.md b/docs/reference/ds.matrixInvert.md new file mode 100644 index 00000000..06ef62ed --- /dev/null +++ b/docs/reference/ds.matrixInvert.md @@ -0,0 +1,111 @@ +# Inverts a server-side square matrix + +Inverts a square matrix and writes the output to the server-side + +## Usage + +``` r +ds.matrixInvert(M1 = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- M1: + + A character string specifying the name of the matrix to be inverted. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrixinvert.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixInvert` returns to the server-side the inverts square matrix. +Also, two validity messages are returned to the client-side indicating +whether the new object has been created in each data source and if so +whether it is in a valid form. + +## Details + +This operation is only possible if the number of columns and rows of the +matrix are the same and it is non-singular-positive definite (e.g. there +is no row or column that is all zeros). + +Server function called: `matrixInvertDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + + #Example 1: Invert the server-side matrix + + #Create the server-side vector + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + #Create the server-side matrix + + ds.matrix(mdata = "ss.vector.9", + from = "serverside.vector", + nrows.scalar = 3, + ncols.scalar = 4, + byrow = TRUE, + newobj = "matrix", + datasources = connections) + + #Invert the matrix + + ds.matrixInvert(M1 = "matrix", + newobj = "matrix.invert", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrixMult.html b/docs/reference/ds.matrixMult.html index cf288087..0917a761 100644 --- a/docs/reference/ds.matrixMult.html +++ b/docs/reference/ds.matrixMult.html @@ -1,56 +1,50 @@ -Calculates tow matrix multiplication in the server-side — ds.matrixMult • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Calculates the matrix product of two matrices and writes output to the server-side.

    -
    +
    +

    Usage

    ds.matrixMult(M1 = NULL, M2 = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    M1
    @@ -72,16 +66,16 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixMult returns to the server-side the result of the two matrix multiplication. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    Undertakes standard matrix multiplication wherewith input matrices A and B with dimensions A: m x n and B: n x p the output matrix C has dimensions m x p. This calculation @@ -89,13 +83,13 @@

    Details

    is the same as the number of rows of B.

    Server function called: matrixMultDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -166,23 +160,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixMult.md b/docs/reference/ds.matrixMult.md new file mode 100644 index 00000000..bbfc525d --- /dev/null +++ b/docs/reference/ds.matrixMult.md @@ -0,0 +1,126 @@ +# Calculates tow matrix multiplication in the server-side + +Calculates the matrix product of two matrices and writes output to the +server-side. + +## Usage + +``` r +ds.matrixMult(M1 = NULL, M2 = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- M1: + + a character string specifying the name of the first matrix. + +- M2: + + a character string specifying the name of the second matrix. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrixmult.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixMult` returns to the server-side the result of the two matrix +multiplication. Also, two validity messages are returned to the +client-side indicating whether the new object has been created in each +data source and if so whether it is in a valid form. + +## Details + +Undertakes standard matrix multiplication wherewith input matrices `A` +and `B` with dimensions `A: m x n` and `B: n x p` the output matrix `C` +has dimensions `m x p`. This calculation is only valid if the number of +columns of `A` is the same as the number of rows of `B`. + +Server function called: `matrixMultDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + + #Example 1: Multiplicate two server-side matrix + + #Create the server-side vector + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + #Create the server-side matrixes + + ds.matrix(mdata = "ss.vector.9",#using the created vector + from = "serverside.vector", + nrows.scalar = 5, + ncols.scalar = 4, + byrow = TRUE, + newobj = "matrix1", + datasources = connections) + + ds.matrix(mdata = 10, + from = "clientside.scalar", + nrows.scalar = 4, + ncols.scalar = 6, + byrow = TRUE, + newobj = "matrix2", + datasources = connections) + + #Multiplicate the matrixes + + ds.matrixMult(M1 = "matrix1", + M2 = "matrix2", + newobj = "matrix.mult", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.matrixTranspose.html b/docs/reference/ds.matrixTranspose.html index bfe3df4f..0defbb09 100644 --- a/docs/reference/ds.matrixTranspose.html +++ b/docs/reference/ds.matrixTranspose.html @@ -1,54 +1,47 @@ -Transposes a server-side matrix — ds.matrixTranspose • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Transposes a matrix and writes the output to the server-side

    -
    +
    +

    Usage

    ds.matrixTranspose(M1 = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    M1
    @@ -67,15 +60,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.matrixTranspose returns to the server-side the transpose matrix. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This operation converts matrix A to matrix C where element C[i,j] of matrix C equals element A[j,i] of matrix @@ -83,13 +76,13 @@

    Details

    of rows as matrix C has columns and vice versa.

    Server function called: matrixTransposeDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -151,23 +144,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.matrixTranspose.md b/docs/reference/ds.matrixTranspose.md new file mode 100644 index 00000000..19127ec7 --- /dev/null +++ b/docs/reference/ds.matrixTranspose.md @@ -0,0 +1,112 @@ +# Transposes a server-side matrix + +Transposes a matrix and writes the output to the server-side + +## Usage + +``` r +ds.matrixTranspose(M1 = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- M1: + + a character string specifying the name of the matrix. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `matrixtranspose.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.matrixTranspose` returns to the server-side the transpose matrix. +Also, two validity messages are returned to the client-side indicating +whether the new object has been created in each data source and if so +whether it is in a valid form. + +## Details + +This operation converts matrix `A` to matrix `C` where element `C[i,j]` +of matrix `C` equals element `A[j,i]` of matrix `A`. Matrix `A`, +therefore, has the same number of rows as matrix `C` has columns and +vice versa. + +Server function called: `matrixTransposeDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + + #Example 1: Transpose the server-side matrix + + #Create the server-side vector + + ds.rUnif(samp.size = 9, + min = -10.5, + max = 10.5, + newobj = "ss.vector.9", + seed.as.integer = 5575, + force.output.to.k.decimal.places = 0, + datasources = connections) + + #Create the server-side matrix + + ds.matrix(mdata = "ss.vector.9", + from = "serverside.vector", + nrows.scalar = 3, + ncols.scalar = 4, + byrow = TRUE, + newobj = "matrix", + datasources = connections) + + #Transpose the matrix + + ds.matrixTranspose(M1 = "matrix", + newobj = "matrix.transpose", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.mdPattern.html b/docs/reference/ds.mdPattern.html index 4e2b3b44..bdcc906d 100644 --- a/docs/reference/ds.mdPattern.html +++ b/docs/reference/ds.mdPattern.html @@ -1,58 +1,53 @@ -Display missing data patterns with disclosure control — ds.mdPattern • dsBaseClientDisplay missing data patterns with disclosure control — ds.mdPattern • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is a client-side wrapper for the server-side mdPatternDS function. It generates a missing data pattern matrix similar to mice::md.pattern but with disclosure control applied to prevent revealing small cell counts.

    -
    +
    +

    Usage

    ds.mdPattern(x = NULL, type = "split", datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -72,8 +67,8 @@

    Arguments

    connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    For type='split': A list with one element per study, each containing:

    pattern

    The missing data pattern matrix for that study

    @@ -95,8 +90,8 @@

    Value

    -
    -

    Details

    +
    +

    Details

    The function calls the server-side mdPatternDS function which uses mice::md.pattern to analyze missing data patterns. Patterns with counts below the disclosure threshold (default: nfilter.tab = 3) are suppressed to maintain privacy.

    @@ -125,13 +120,13 @@

    Details

    and pool shows count=7, one could deduce study B has count=2, violating disclosure) - Different patterns across studies are preserved separately in the pooled result

    -
    -

    Author

    +
    +

    Author

    Xavier Escribà montagut for DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
      ## Version 6, for version 5 see the Wiki
     
    @@ -179,23 +174,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.mdPattern.md b/docs/reference/ds.mdPattern.md new file mode 100644 index 00000000..128c59f3 --- /dev/null +++ b/docs/reference/ds.mdPattern.md @@ -0,0 +1,153 @@ +# Display missing data patterns with disclosure control + +This function is a client-side wrapper for the server-side mdPatternDS +function. It generates a missing data pattern matrix similar to +mice::md.pattern but with disclosure control applied to prevent +revealing small cell counts. + +## Usage + +``` r +ds.mdPattern(x = NULL, type = "split", datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of a data frame or matrix on + the server-side containing the data to analyze. + +- type: + + a character string specifying the output type. If 'split' (default), + returns separate patterns for each study. If 'combine', attempts to + pool patterns across studies. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified, the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +For type='split': A list with one element per study, each containing: + +- pattern: + + The missing data pattern matrix for that study + +- valid: + + Logical indicating if all patterns meet disclosure requirements + +- message: + + A message describing the validity status + +For type='combine': A list containing: + +- pattern: + + The pooled missing data pattern matrix across all studies + +- valid: + + Logical indicating if all pooled patterns meet disclosure requirements + +- message: + + A message describing the validity status + +## Details + +The function calls the server-side mdPatternDS function which uses +mice::md.pattern to analyze missing data patterns. Patterns with counts +below the disclosure threshold (default: nfilter.tab = 3) are suppressed +to maintain privacy. + +**Output Format:** - Each row represents a missing data pattern - +Pattern counts are shown in row names (e.g., "150", "25") - Columns show +1 if the variable is observed, 0 if missing - Last column shows the +total number of missing values per pattern - Last row shows the total +number of missing values per variable + +**Disclosure Control:** + +Suppressed patterns (count below threshold) are indicated by: - Row +name: "suppressed(\)" where N is the threshold - All pattern values +set to NA - Summary row also suppressed to prevent back-calculation + +**Pooling Behavior (type='combine'):** + +When pooling across studies, the function uses a *conservative approach* +for disclosure control: + +1\. Identifies identical missing patterns across studies 2. **EXCLUDES +suppressed patterns from pooling** - patterns suppressed in ANY study +are not included in the pooled count 3. Sums counts only for +non-suppressed identical patterns 4. Re-validates pooled counts against +disclosure threshold + +**Important:** This conservative approach means: - Pooled counts may be +*underestimates* if some studies had suppressed patterns - This prevents +disclosure through subtraction (e.g., if study A shows count=5 and pool +shows count=7, one could deduce study B has count=2, violating +disclosure) - Different patterns across studies are preserved separately +in the pooled result + +## Author + +Xavier Escribà montagut for DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Get missing data patterns for each study separately + patterns_split <- ds.mdPattern(x = "D", type = "split", datasources = connections) + + # View results for study1 + print(patterns_split$study1$pattern) + # var1 var2 var3 + # 150 1 1 1 0 <- 150 obs complete + # 25 0 1 1 1 <- 25 obs missing var1 + # 25 0 0 25 <- Summary: 25 missing per variable + + # Get pooled missing data patterns across studies + patterns_pooled <- ds.mdPattern(x = "D", type = "combine", datasources = connections) + print(patterns_pooled$pattern) + + # Example with suppressed patterns: + # If study1 has a pattern with count=2 (suppressed) and study2 has same pattern + # with count=5 (valid), the pooled result will show count=5 (conservative approach) + # A warning will indicate: "Pooled counts may underestimate the true total" + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.mean.html b/docs/reference/ds.mean.html index a34248d5..82cf9ad2 100644 --- a/docs/reference/ds.mean.html +++ b/docs/reference/ds.mean.html @@ -1,62 +1,56 @@ -Computes server-side vector statistical mean — ds.mean • dsBaseClient - - -
    -
    +
    +
    +
    -
    - -
    +

    This function computes the statistical mean of a given server-side vector.

    -
    +
    +

    Usage

    ds.mean(
       x = NULL,
       type = "split",
    -  checks = FALSE,
       save.mean.Nvalid = FALSE,
    -  datasources = NULL
    +  datasources = NULL,
    +  classConsistencyCheck = FALSE
     )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -71,13 +65,6 @@

    Arguments

    For more information see Details.

    -
    checks
    -

    logical. If TRUE optional checks of model -components will be undertaken. Default is FALSE to save time. -It is suggested that checks -should only be undertaken once the function call has failed.

    - -
    save.mean.Nvalid

    logical. If TRUE generated values of the mean and the number of valid (non-missing) observations will be saved on the data servers. @@ -90,21 +77,26 @@

    Arguments

    objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default FALSE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.mean returns to the client-side a list including:

    Mean.by.Study: estimated mean, Nmissing (number of missing observations), Nvalid (number of valid observations) and Ntotal (sum of missing and valid observations) separately for each study (if type = split or type = both).
    Global.Mean: estimated mean, Nmissing, Nvalid and Ntotal -across all studies combined (if type = combine or type = both).
    Nstudies: number of studies being analysed.
    ValidityMessage: indicates if the analysis was possible.

    +across all studies combined (if type = combine or type = both).
    Nstudies: number of studies being analysed.

    If save.mean.Nvalid is set as TRUE, the objects Nvalid.all.studies, Nvalid.study.specific, mean.all.studies and mean.study.specific are written to the server-side.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the R function mean.

    The function can carry out 3 types of analysis depending on the argument type:
    @@ -124,18 +116,19 @@

    Details

    the isDefined internal function checks whether the key variables have been created.

    Server function called: meanDS

    -
    -

    See also

    +
    +

    See also

    ds.quantileMean to compute quantiles.

    ds.summary to generate the summary of a variable.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -167,7 +160,6 @@ 

    Examples

    ds.mean(x = "D$LAB_TSC", type = "split", - checks = FALSE, save.mean.Nvalid = FALSE, datasources = connections) @@ -177,23 +169,19 @@

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.mean.md b/docs/reference/ds.mean.md new file mode 100644 index 00000000..aa1e13f8 --- /dev/null +++ b/docs/reference/ds.mean.md @@ -0,0 +1,141 @@ +# Computes server-side vector statistical mean + +This function computes the statistical mean of a given server-side +vector. + +## Usage + +``` r +ds.mean( + x = NULL, + type = "split", + save.mean.Nvalid = FALSE, + datasources = NULL, + classConsistencyCheck = FALSE +) +``` + +## Arguments + +- x: + + a character specifying the name of a numerical vector. + +- type: + + a character string that represents the type of analysis to carry out. + This can be set as `'combine'`, `'combined'`, `'combines'`, `'split'`, + `'splits'`, `'s'`, `'both'` or `'b'`. For more information see + **Details**. + +- save.mean.Nvalid: + + logical. If TRUE generated values of the mean and the number of valid + (non-missing) observations will be saved on the data servers. Default + FALSE. For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default FALSE. + +## Value + +`ds.mean` returns to the client-side a list including: + +`Mean.by.Study`: estimated mean, `Nmissing` (number of missing +observations), `Nvalid` (number of valid observations) and `Ntotal` (sum +of missing and valid observations) separately for each study (if +`type = split` or `type = both`). +`Global.Mean`: estimated mean, `Nmissing`, `Nvalid` and `Ntotal` across +all studies combined (if `type = combine` or `type = both`). +`Nstudies`: number of studies being analysed. + +If `save.mean.Nvalid` is set as TRUE, the objects `Nvalid.all.studies`, +`Nvalid.study.specific`, `mean.all.studies` and `mean.study.specific` +are written to the server-side. + +## Details + +This function is similar to the R function `mean`. + +The function can carry out 3 types of analysis depending on the argument +`type`: +(1) If `type` is set to `'combine'`, `'combined'`, `'combines'` or +`'c'`, a global mean is calculated. +(2) If `type` is set to `'split'`, `'splits'` or `'s'`, the mean is +calculated separately for each study. +(3) If `type` is set to `'both'` or `'b'`, both sets of outputs are +produced. + +If the argument `save.mean.Nvalid` is set to TRUE study-specific means +and `Nvalids` as well as the global equivalents across all studies +combined are saved in the server-side. Once the estimated means and +`Nvalids` are written into the server-side R environments, they can be +used directly to centralize the variable of interest around its global +mean or its study-specific means. Finally, the `isDefined` internal +function checks whether the key variables have been created. + +Server function called: `meanDS` + +## See also + +`ds.quantileMean` to compute quantiles. + +`ds.summary` to generate the summary of a variable. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Calculate the mean of a vector in the server-side + + ds.mean(x = "D$LAB_TSC", + type = "split", + save.mean.Nvalid = FALSE, + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.meanByClass.html b/docs/reference/ds.meanByClass.html index 9f52098e..c0c32a78 100644 --- a/docs/reference/ds.meanByClass.html +++ b/docs/reference/ds.meanByClass.html @@ -1,51 +1,45 @@ -Computes the mean and standard deviation across categories — ds.meanByClass • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the mean and the standard deviation (SD) of a continuous variable for each class of up to 3 categorical variables.

    -
    +
    +

    Usage

    ds.meanByClass(
       x = NULL,
       outvar = NULL,
    @@ -55,8 +49,8 @@ 

    Computes the mean and standard deviation across categories

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -84,14 +78,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.meanByClass returns to the client-side a table or a list of tables that hold the length of the numeric variable(s) and their mean and standard deviation in each subgroup (subset).

    -
    -

    Details

    +
    +

    Details

    The function splits the input dataset into subsets (one for each category) and calculates the mean and SD of the specified numeric variables. It is important to note that the process of generating the final table(s) can be time consuming particularly if the subsetting is done across @@ -103,18 +97,18 @@

    Details

    (1) 'combine': a pooled table of results is generated.
    (2) 'split': a table of results is generated for each study.

    -
    -

    See also

    +
    +

    See also

    ds.subsetByClass to subset by the classes of factor vector(s).

    ds.subset to subset by complete cases (i.e. removing missing values), threshold, columns and rows.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -161,23 +155,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.meanByClass.md b/docs/reference/ds.meanByClass.md new file mode 100644 index 00000000..e689f73e --- /dev/null +++ b/docs/reference/ds.meanByClass.md @@ -0,0 +1,128 @@ +# Computes the mean and standard deviation across categories + +This function calculates the mean and the standard deviation (SD) of a +continuous variable for each class of up to 3 categorical variables. + +## Usage + +``` r +ds.meanByClass( + x = NULL, + outvar = NULL, + covar = NULL, + type = "combine", + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string specifying the name of the dataset or a text + formula. + +- outvar: + + a character vector specifying the names of the continuous variables. + +- covar: + + a character vector specifying the names of up to 3 categorical + variables + +- type: + + a character string that represents the type of analysis to carry out. + `type` can be set as: `'combine'` or `'split'`. Default `'combine'`. + For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.meanByClass` returns to the client-side a table or a list of tables +that hold the length of the numeric variable(s) and their mean and +standard deviation in each subgroup (subset). + +## Details + +The function splits the input dataset into subsets (one for each +category) and calculates the mean and SD of the specified numeric +variables. It is important to note that the process of generating the +final table(s) can be time consuming particularly if the subsetting is +done across more than one categorical variable and the run-time +lengthens if the parameter `type` is set to `'split'` as a table is then +produced for each study. It is therefore advisable to run the function +only for the studies of the user interested in but including only those +studies in the parameter `datasources`. + +Depending on the variable `type` can be carried out two analysis: +(1) `'combine'`: a pooled table of results is generated. +(2) `'split'`: a table of results is generated for each study. + +## See also + +[`ds.subsetByClass`](ds.subsetByClass.md) to subset by the classes of +factor vector(s). + +[`ds.subset`](ds.subset.md) to subset by complete cases (i.e. removing +missing values), threshold, columns and rows. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Calculate mean by class + + ds.meanByClass(x = "D", + outvar = c('LAB_HDL','LAB_TSC'), + covar = c('PM_BMI_CATEGORICAL'), + type = "combine", + datasources = connections) + + ds.meanByClass(x = "D$LAB_HDL~D$PM_BMI_CATEGORICAL", + type = "combine", + datasources = connections[1])#Only the frist server is used ("study1") + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.meanSdGp.html b/docs/reference/ds.meanSdGp.html index 94a474a0..13fdccbf 100644 --- a/docs/reference/ds.meanSdGp.html +++ b/docs/reference/ds.meanSdGp.html @@ -1,62 +1,56 @@ -Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp • dsBaseClient - - -
    -
    +
    +
    +
    -
    - -
    +

    This function calculates the mean and SD of a continuous variable for each class of a single factor.

    -
    +
    +

    Usage

    ds.meanSdGp(
       x = NULL,
       y = NULL,
       type = "both",
    -  do.checks = FALSE,
    -  datasources = NULL
    +  datasources = NULL,
    +  classConsistencyCheck = TRUE
     )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -76,26 +70,24 @@

    Arguments

    For more information see Details.

    -
    do.checks
    -

    logical. If TRUE the administrative checks -are undertaken to ensure that the input objects are defined in all studies and that the -variables are of equivalent class in each study. -Default is FALSE to save time.

    - -
    datasources

    a list of DSConnection-class objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.meanSdGp returns to the client-side the mean, SD, Nvalid and SEM combined across studies and/or separately for each study, depending on the argument type.

    -
    -

    Details

    +
    +

    Details

    This function calculates the mean, standard deviation (SD), N (number of observations) and the standard error of the mean (SEM) of a continuous variable broken down into subgroups defined by a single factor.

    @@ -138,19 +130,20 @@

    Details

    (3) "both" both sets of outputs are produced.

    Server function called: meanSdGpDS

    -
    -

    See also

    +
    +

    See also

    ds.subsetByClass to subset by the classes of factor vector(s).

    ds.subset to subset by complete cases (i.e. removing missing values), threshold, columns and rows.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -186,7 +179,6 @@ 

    Examples

    ds.meanSdGp(x = "D$age.60", y = "D$time.id", type = "combine", - do.checks = FALSE, datasources = connections) #Example 2: Calculate the mean, SD, Nvalid and SEM of the continuous variable age.60 (age in @@ -197,7 +189,6 @@

    Examples

    ds.meanSdGp(x = "D$age.60", y = "D$time.id", type = "both", - do.checks = FALSE, datasources = connections) # clear the Datashield R sessions and logout @@ -206,23 +197,19 @@

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.meanSdGp.md b/docs/reference/ds.meanSdGp.md new file mode 100644 index 00000000..774c7aa9 --- /dev/null +++ b/docs/reference/ds.meanSdGp.md @@ -0,0 +1,177 @@ +# Computes the mean and standard deviation across groups defined by one factor + +This function calculates the mean and SD of a continuous variable for +each class of a single factor. + +## Usage + +``` r +ds.meanSdGp( + x = NULL, + y = NULL, + type = "both", + datasources = NULL, + classConsistencyCheck = TRUE +) +``` + +## Arguments + +- x: + + a character string specifying the name of a numeric continuous + variable. + +- y: + + a character string specifying the name of a categorical variable of + class factor. + +- type: + + a character string that represents the type of analysis to carry out. + This can be set as: `"combine"`, `"split"` or `"both"`. Default + `"both"`. For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.meanSdGp` returns to the client-side the mean, SD, Nvalid and SEM +combined across studies and/or separately for each study, depending on +the argument `type`. + +## Details + +This function calculates the mean, standard deviation (SD), N (number of +observations) and the standard error of the mean (SEM) of a continuous +variable broken down into subgroups defined by a single factor. + +There are important differences between `ds.meanSdGp` function compared +to the function `ds.meanByClass`: + +\(A\) `ds.meanSdGp` does not actually subset the data it simply +calculates the required statistics and reports them. This means you +cannot use this function if you wish to physically break the data into +subsets. On the other hand, it makes the function very much faster than +`ds.meanByClass` if you do not need to create physical subsets. +(B) `ds.meanByClass` allows you to specify up to three categorising +factors, but `ds.meanSdGp` only allows one. However, this is not a +serious problem. If you have two factors (e.g. sex with two levels +`[0,1]` and `BMI.categorical` with three levels `[1,2,3]`) you simply +need to create a new factor that combines the two together in a way that +gives each combination of levels a different value in the new factor. +So, in the example given, the calculation `newfactor = (3*sex) + BMI` +gives you six values: +(1) `sex = 0` and `BMI = 1` -\> `newfactor = 1` +(2) `sex = 0` and `BMI = 2` -\> `newfactor = 2` +(3) `sex = 0` and `BMI = 3` -\> `newfactor = 3` +(4) `sex = 1` and `BMI = 1` -\> `newfactor = 4` +(5) `sex = 1` and `BMI = 2` -\> `newfactor = 5` +(6) `sex = 1` and `BMI = 3` -\> `newfactor = 6` + +\(C\) At present, `ds.meanByClass` calculates the sample size in each +group to mean the total sample size (i.e. it includes all observations +in each group regardless of whether or not they include missing values +for the continuous variable or the factor). The calculation of sample +size in each group by `ds.meanSdGp` always reports the number of +observations that are non-missing both for the continuous variable and +the factor. This makes sense - in the case of `ds.meanByClass`, the +total size of the physical subsets was important, but when it comes down +only to `ds.meanSdGp` which undertakes analysis without physical +subsetting, it is only the observations with non-missing values in both +variables that contribute to the calculation of means and SDs within +each group and so it is logical to consider those counts as primary. The +only reference `ds.meanSdGp` makes to missing counts is in the reporting +of `Ntotal` and `Nmissing` overall (ie not broken down by group). + +For the future, we plan to extend `ds.meanByClass` to report both total +and non-missing counts in subgroups. + +Depending on the variable `type` can be carried out different +analysis: +(1) `"combine"`: a pooled table of results is generated. +(2) `"split"` a table of results is generated for each study. +(3) `"both"` both sets of outputs are produced. + +Server function called: `meanSdGpDS` + +## See also + +[`ds.subsetByClass`](ds.subsetByClass.md) to subset by the classes of +factor vector(s). + +[`ds.subset`](ds.subset.md) to subset by complete cases (i.e. removing +missing values), threshold, columns and rows. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + + #Example 1: Calculate the mean, SD, Nvalid and SEM of the continuous variable age.60 (age in + #years centralised at 60), broken down by time.id (a six level factor relating to survival time) + #and report the pooled results combined across studies. + + ds.meanSdGp(x = "D$age.60", + y = "D$time.id", + type = "combine", + datasources = connections) + + #Example 2: Calculate the mean, SD, Nvalid and SEM of the continuous variable age.60 (age in + #years centralised at 60), broken down by time.id (a six level factor relating to survival time) + #and report both study-specific results and the pooled results combined across studies. + #Save the returned output to msg.b. + + ds.meanSdGp(x = "D$age.60", + y = "D$time.id", + type = "both", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.merge.html b/docs/reference/ds.merge.html index b42339e8..dced4fa7 100644 --- a/docs/reference/ds.merge.html +++ b/docs/reference/ds.merge.html @@ -1,51 +1,45 @@ -Merges two data frames in the server-side — ds.merge • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Merges (links) two data frames together based on common values in defined vectors in each data frame.

    -
    +
    +

    Usage

    ds.merge(
       x.name = NULL,
       y.name = NULL,
    @@ -62,8 +56,8 @@ 

    Merges two data frames in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -139,15 +133,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.merge returns the merged data frame that is written on the server-side. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the native R function merge. There are some changes compared with the native R function in choosing which variables to use to merge the data frames, the function merge @@ -158,13 +152,13 @@

    Details

    by.y.names arguments.

    Server function called: mergeDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -224,23 +218,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.merge.md b/docs/reference/ds.merge.md new file mode 100644 index 00000000..80341761 --- /dev/null +++ b/docs/reference/ds.merge.md @@ -0,0 +1,184 @@ +# Merges two data frames in the server-side + +Merges (links) two data frames together based on common values in +defined vectors in each data frame. + +## Usage + +``` r +ds.merge( + x.name = NULL, + y.name = NULL, + by.x.names = NULL, + by.y.names = NULL, + all.x = FALSE, + all.y = FALSE, + sort = TRUE, + suffixes = c(".x", ".y"), + no.dups = TRUE, + incomparables = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x.name: + + a character string specifying the name of the first data frame to be + merged. The length of the string should be less than the specified + threshold for the nfilter.stringShort which is one of the disclosure + prevention checks in DataSHIELD. + +- y.name: + + a character string specifying the name of the second data frame to be + merged. The length of the string should be less than the specified + threshold for the nfilter.stringShort which is one of the disclosure + prevention checks in DataSHIELD. + +- by.x.names: + + a character string or a vector of names specifying of the column(s) in + data frame `x.name` for merging. + +- by.y.names: + + a character string or a vector of names specifying of the column(s) in + data frame `y.name` for merging. + +- all.x: + + logical. If TRUE then extra rows will be added to the output, one for + each row in `x.name` that has no matching row in `y.name`. If FALSE + the rows with data from both data frames are included in the output. + Default FALSE. + +- all.y: + + logical. If TRUE then extra rows will be added to the output, one for + each row in `y.name` that has no matching row in `x.name`. If FALSE + the rows with data from both data frames are included in the output. + Default FALSE. + +- sort: + + logical. If TRUE the merged result is sorted on elements in the + `by.x.names` and `by.y.names` columns. Default TRUE. + +- suffixes: + + a character vector of length 2 specifying the suffixes to be used for + making unique common column names in the two input data frames when + they both appear in the merged data frame. + +- no.dups: + + logical. Suffixes are appended in more cases to avoid duplicated + column names in the merged data frame. Default TRUE (FALSE before R + version 3.5.0). + +- incomparables: + + values that cannot be matched. This is intended to be used for merging + on one column, so these are incomparable values of that column. For + more information see `match` in native R `merge` function. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `merge.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.merge` returns the merged data frame that is written on the +server-side. Also, two validity messages are returned to the client-side +indicating whether the new object has been created in each data source +and if so whether it is in a valid form. + +## Details + +This function is similar to the native R function `merge`. There are +some changes compared with the native R function in choosing which +variables to use to merge the data frames, the function `merge` is very +flexible. For example, you can choose to merge using all vectors that +appear in both data frames. However, for `ds.merge` in DataSHIELD it is +required that all the vectors which dictate the merging are explicitly +identified for both data frames using the `by.x.names` and `by.y.names` +arguments. + +Server function called: `mergeDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create two data frames with a common column + + ds.dataFrame(x = c("D$LAB_TSC","D$LAB_TRIG","D$LAB_HDL","D$LAB_GLUC_ADJUSTED"), + completeCases = TRUE, + newobj = "df.x", + datasources = connections) + + ds.dataFrame(x = c("D$LAB_TSC","D$GENDER","D$PM_BMI_CATEGORICAL","D$PM_BMI_CONTINUOUS"), + completeCases = TRUE, + newobj = "df.y", + datasources = connections) + + # Merge data frames using the common variable "LAB_TSC" + + ds.merge(x.name = "df.x", + y.name = "df.y", + by.x.names = "df.x$LAB_TSC", + by.y.names = "df.y$LAB_TSC", + all.x = TRUE, + all.y = TRUE, + sort = TRUE, + suffixes = c(".x", ".y"), + no.dups = TRUE, + newobj = "df.merge", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.message.html b/docs/reference/ds.message.html index 0077360b..7dd16fa5 100644 --- a/docs/reference/ds.message.html +++ b/docs/reference/ds.message.html @@ -1,56 +1,50 @@ -Returns server-side messages to the client-side — ds.message • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function allows for error messages arising from the running of a server-side assign function to be returned to the client-side.

    -
    +
    +

    Usage

    ds.message(message.obj.name = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    message.obj.name
    @@ -64,14 +58,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.message returns a list object from each study, containing the message that has been written by DataSHIELD into $studysideMessage.

    -
    -

    Details

    +
    +

    Details

    Errors arising from aggregate server-side functions can be returned directly to the client-side. But this is not possible for server-side assign functions because they are designed specifically to write objects to the @@ -86,13 +80,13 @@

    Details

    cannot exceed a length of nfilter.string a default of 80 characters.

    Server function called: messageDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -136,23 +130,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.message.md b/docs/reference/ds.message.md new file mode 100644 index 00000000..4a592976 --- /dev/null +++ b/docs/reference/ds.message.md @@ -0,0 +1,99 @@ +# Returns server-side messages to the client-side + +This function allows for error messages arising from the running of a +server-side assign function to be returned to the client-side. + +## Usage + +``` r +ds.message(message.obj.name = NULL, datasources = NULL) +``` + +## Arguments + +- message.obj.name: + + is a character string specifying the name of the list that contains + the message. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.message` returns a list object from each study, containing the +message that has been written by DataSHIELD into `$studysideMessage`. + +## Details + +Errors arising from aggregate server-side functions can be returned +directly to the client-side. But this is not possible for server-side +assign functions because they are designed specifically to write objects +to the server-side and to return no meaningful information to the +client-side. Otherwise, users may be able to use assign functions to +return disclosive output to the client-side. + +Server-side functions from which error messages are to be made available +are designed to be able to write the designated error message to the +`$serversideMessage` object into the list that is saved on the +server-side as the primary output of that function. So only valid +server-side functions of DataSHIELD can write a `$studysideMessage`. The +error message is a string that cannot exceed a length of +`nfilter.string` a default of 80 characters. + +Server function called: `messageDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Use a ds.asCharacter assign function to create the message in the server-side + + ds.asCharacter(x.name = "D$LAB_TRIG", + newobj = "vector1", + datasources = connections) + + #Return the message to the client-side + + ds.message(message.obj.name = "vector1", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.metadata.html b/docs/reference/ds.metadata.html index 08b782e4..25181a0c 100644 --- a/docs/reference/ds.metadata.html +++ b/docs/reference/ds.metadata.html @@ -1,56 +1,50 @@ -Gets the metadata associated with a variable held on the server — ds.metadata • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function gets the metadata of a variable stored on the server.

    -
    +
    +

    Usage

    ds.metadata(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -63,23 +57,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.metadata returns to the client-side the metadata of associated to an object held at the server.

    -
    -

    Details

    +
    +

    Details

    Server function metadataDS is called examines the attributes associated with the variable which are non-disclosive.

    -
    -

    Author

    +
    +

    Author

    Stuart Wheater, DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # connecting to the Opal servers
    @@ -114,23 +108,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.metadata.md b/docs/reference/ds.metadata.md new file mode 100644 index 00000000..089db1a2 --- /dev/null +++ b/docs/reference/ds.metadata.md @@ -0,0 +1,73 @@ +# Gets the metadata associated with a variable held on the server + +This function gets the metadata of a variable stored on the server. + +## Usage + +``` r +ds.metadata(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of the object. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.metadata` returns to the client-side the metadata of associated to +an object held at the server. + +## Details + +Server function `metadataDS` is called examines the attributes +associated with the variable which are non-disclosive. + +## Author + +Stuart Wheater, DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Get the metadata associated with variable 'D' + ds.metadata(x = 'D$LAB_TSC', datasources = connections) + + # clear the Datashield R sessions and logout + DSI::datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.mice.html b/docs/reference/ds.mice.html index 4435d2c5..dd172e84 100644 --- a/docs/reference/ds.mice.html +++ b/docs/reference/ds.mice.html @@ -1,5 +1,5 @@ -Multivariate Imputation by Chained Equations — ds.mice • dsBaseClientMultivariate Imputation by Chained Equations — ds.mice • dsBaseClient - - -
    -
    +
    -
    - +
    +
    +
    -
    +

    This function calls the miceDS that is a wrapper function of the mice from the mice R package. The function creates multiple imputations (replacement values) for multivariate missing data. The method is based on Fully Conditional Specification, @@ -59,7 +59,8 @@

    Multivariate Imputation by Chained Equations

    data have the same columns in all datasources and in the same order.

    -
    +
    +

    Usage

    ds.mice(
       data = NULL,
       m = 5,
    @@ -74,8 +75,8 @@ 

    Multivariate Imputation by Chained Equations

    )
    -
    -

    Arguments

    +
    +

    Arguments

    data
    @@ -138,37 +139,33 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    a list with three elements: the method, the predictorMatrix and the post.

    -
    -

    Details

    +
    +

    Details

    For additional details see the help header of mice function in native R mice package.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.mice.md b/docs/reference/ds.mice.md new file mode 100644 index 00000000..b3ada200 --- /dev/null +++ b/docs/reference/ds.mice.md @@ -0,0 +1,112 @@ +# Multivariate Imputation by Chained Equations + +This function calls the miceDS that is a wrapper function of the mice +from the mice R package. The function creates multiple imputations +(replacement values) for multivariate missing data. The method is based +on Fully Conditional Specification, where each incomplete variable is +imputed by a separate model. The MICE algorithm can impute mixes of +continuous, binary, unordered categorical and ordered categorical data. +In addition, MICE can impute continuous two-level data, and maintain +consistency between imputations by means of passive imputation. It is +recommended that the imputation is done in each datasource separately. +Otherwise the user should make sure that the input data have the same +columns in all datasources and in the same order. + +## Usage + +``` r +ds.mice( + data = NULL, + m = 5, + maxit = 5, + method = NULL, + predictorMatrix = NULL, + post = NULL, + seed = NA, + newobj_mids = NULL, + newobj_df = NULL, + datasources = NULL +) +``` + +## Arguments + +- data: + + a data frame or a matrix containing the incomplete data. + +- m: + + Number of multiple imputations. The default is m=5. + +- maxit: + + A scalar giving the number of iterations. The default is 5. + +- method: + + Can be either a single string, or a vector of strings with length + ncol(data), specifying the imputation method to be used for each + column in data. If specified as a single string, the same method will + be used for all blocks. The default imputation method (when no + argument is specified) depends on the measurement level of the target + column, as regulated by the defaultMethod argument in native R mice + function. Columns that need not be imputed have the empty method "". + +- predictorMatrix: + + A numeric matrix of ncol(data) rows and ncol(data) columns, containing + 0/1 data specifying the set of predictors to be used for each target + column. Each row corresponds to a variable to be imputed. A value of 1 + means that the column variable is used as a predictor for the target + variables (in the rows). By default, the predictorMatrix is a square + matrix of ncol(data) rows and columns with all 1's, except for the + diagonal. + +- post: + + A vector of strings with length ncol(data) specifying expressions as + strings. Each string is parsed and executed within the sampler() + function to post-process imputed values during the iterations. The + default is a vector of empty strings, indicating no post-processing. + Multivariate (block) imputation methods ignore the post parameter. + +- seed: + + either NA (default) or "fixed". If seed is set to "fixed" then a fixed + seed random number generator which is study-specific is used. + +- newobj_mids: + + a character string that provides the name for the output mids object + that is stored on the data servers. Default `mids_object`. + +- newobj_df: + + a character string that provides the name for the output dataframes + that are stored on the data servers. Default `imputationSet`. For + example, if m=5, and newobj_df="imputationSet", then five imputed + dataframes are saved on the servers with names imputationSet.1, + imputationSet.2, imputationSet.3, imputationSet.4, imputationSet.5. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +a list with three elements: the method, the predictorMatrix and the +post. + +## Details + +For additional details see the help header of mice function in native R +mice package. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.names.html b/docs/reference/ds.names.html index 2cbc5feb..d7b0ab79 100644 --- a/docs/reference/ds.names.html +++ b/docs/reference/ds.names.html @@ -1,54 +1,47 @@ -Return the names of a list object — ds.names • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Returns the names of a designated server-side list

    -
    +
    +

    Usage

    ds.names(xname = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    xname
    @@ -63,13 +56,13 @@

    Arguments

    see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.names returns to the client-side the names of a list object stored on the server-side.

    -
    -

    Details

    +
    +

    Details

    ds.names calls aggregate function namesDS. This function is similar to the native R function names but it does not subsume all functionality, for example, it only works to extract names that already exist, @@ -80,14 +73,15 @@

    Details

    using ds.glmSLMA. The resultant object saved on each server separately is formally of class "glm" and "ls" but responds TRUE to is.list(),

    -
    -

    Author

    +
    +

    Author

    Amadou Gaye, updated by Paul Burton for DataSHIELD development team 25/06/2020

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -134,23 +128,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.names.md b/docs/reference/ds.names.md new file mode 100644 index 00000000..ba53c24d --- /dev/null +++ b/docs/reference/ds.names.md @@ -0,0 +1,98 @@ +# Return the names of a list object + +Returns the names of a designated server-side list + +## Usage + +``` r +ds.names(xname = NULL, datasources = NULL) +``` + +## Arguments + +- xname: + + a character string specifying the name of the list. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login that represent the particular data + sources (studies) to be addressed by the function call. If the + `datasources` argument is not specified the default set of connections + will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.names` returns to the client-side the names of a list object stored +on the server-side. + +## Details + +ds.names calls aggregate function namesDS. This function is similar to +the native R function `names` but it does not subsume all functionality, +for example, it only works to extract names that already exist, not to +create new names for objects. The function is restricted to objects of +type list, but this includes objects that have a primary class other +than list but which return TRUE to the native R function `is.list`. As +an example this includes the multi-component object created by fitting a +generalized linear model using ds.glmSLMA. The resultant object saved on +each server separately is formally of class "glm" and "ls" but responds +TRUE to is.list(), + +## Author + +Amadou Gaye, updated by Paul Burton for DataSHIELD development team +25/06/2020 + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create a list in the server-side + + ds.asList(x.name = "D", + newobj = "D.list", + datasources = connections) + + #Get the names of the list + + ds.names(xname = "D.list", + datasources = connections) + + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.ns.html b/docs/reference/ds.ns.html index 4542ab75..847c6b03 100644 --- a/docs/reference/ds.ns.html +++ b/docs/reference/ds.ns.html @@ -1,53 +1,48 @@ -Generate a Basis Matrix for Natural Cubic Splines — ds.ns • dsBaseClientGenerate a Basis Matrix for Natural Cubic Splines — ds.ns • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is based on the native R function ns from the splines package. This function generate the B-spline basis matrix for a natural cubic spline.

    -
    +
    +

    Usage

    ds.ns(
       x,
       df = NULL,
    @@ -59,8 +54,8 @@ 

    Generate a Basis Matrix for Natural Cubic Splines

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -100,15 +95,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    A matrix of dimension length(x) * df where either df was supplied or if knots were supplied, df = length(knots) + 1 + intercept. Attributes are returned that correspond to the arguments to ns, and explicitly give the knots, Boundary.knots etc for use by predict.ns(). The object is assigned at each serverside.

    -
    -

    Details

    +
    +

    Details

    ns is native R is based on the function splineDesign. It generates a basis matrix for representing the family of piecewise-cubic splines with the specified sequence of interior knots, and the natural boundary conditions. These enforce the constraint @@ -116,28 +111,24 @@

    Details

    to the extremes of the data. A primary use is in modelling formula to directly specify a natural spline term in a model.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.ns.md b/docs/reference/ds.ns.md new file mode 100644 index 00000000..23f09136 --- /dev/null +++ b/docs/reference/ds.ns.md @@ -0,0 +1,85 @@ +# Generate a Basis Matrix for Natural Cubic Splines + +This function is based on the native R function `ns` from the `splines` +package. This function generate the B-spline basis matrix for a natural +cubic spline. + +## Usage + +``` r +ds.ns( + x, + df = NULL, + knots = NULL, + intercept = FALSE, + Boundary.knots = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + the predictor variable. Missing values are allowed. + +- df: + + degrees of freedom. One can supply df rather than knots; ns() then + chooses df - 1 - intercept knots at suitably chosen quantiles of x + (which will ignore missing values). The default, df = NULL, sets the + number of inner knots as length(knots). + +- knots: + + breakpoints that define the spline. The default is no knots; together + with the natural boundary conditions this results in a basis for + linear regression on x. Typical values are the mean or median for one + knot, quantiles for more knots. See also Boundary.knots. + +- intercept: + + if TRUE, an intercept is included in the basis; default is FALSE. + +- Boundary.knots: + + boundary points at which to impose the natural boundary conditions and + anchor the B-spline basis (default the range of the data). If both + knots and Boundary.knots are supplied, the basis parameters do not + depend on x. Data can extend beyond Boundary.knots. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `ns.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +A matrix of dimension length(x) \* df where either df was supplied or if +knots were supplied, df = length(knots) + 1 + intercept. Attributes are +returned that correspond to the arguments to ns, and explicitly give the +knots, Boundary.knots etc for use by predict.ns(). The object is +assigned at each serverside. + +## Details + +`ns` is native R is based on the function `splineDesign`. It generates a +basis matrix for representing the family of piecewise-cubic splines with +the specified sequence of interior knots, and the natural boundary +conditions. These enforce the constraint that the function is linear +beyond the boundary knots, which can either be supplied or default to +the extremes of the data. A primary use is in modelling formula to +directly specify a natural spline term in a model. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.numNA.html b/docs/reference/ds.numNA.html index ced8a0da..b3fd6d5a 100644 --- a/docs/reference/ds.numNA.html +++ b/docs/reference/ds.numNA.html @@ -1,56 +1,50 @@ -Gets the number of missing values in a server-side vector — ds.numNA • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function helps to know the number of missing values in a vector that is stored on the server-side.

    -
    -
    ds.numNA(x = NULL, datasources = NULL)
    +
    +

    Usage

    +
    ds.numNA(x = NULL, datasources = NULL, classConsistencyCheck = TRUE)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -62,24 +56,30 @@

    Arguments

    objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default TRUE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.numNA returns to the client-side the number of missing values on a server-side vector.

    -
    -

    Details

    +
    +

    Details

    The number of missing entries are counted and the total for each study is returned.

    Server function called: numNaDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
      ## Version 6, for version 5 see the Wiki
       
    @@ -119,23 +119,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.numNA.md b/docs/reference/ds.numNA.md new file mode 100644 index 00000000..4157017b --- /dev/null +++ b/docs/reference/ds.numNA.md @@ -0,0 +1,88 @@ +# Gets the number of missing values in a server-side vector + +This function helps to know the number of missing values in a vector +that is stored on the server-side. + +## Usage + +``` r +ds.numNA(x = NULL, datasources = NULL, classConsistencyCheck = TRUE) +``` + +## Arguments + +- x: + + a character string specifying the name of the vector. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default TRUE. + +## Value + +`ds.numNA` returns to the client-side the number of missing values on a +server-side vector. + +## Details + +The number of missing entries are counted and the total for each study +is returned. + +Server function called: `numNaDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Get the number of missing values on a server-side vector + + ds.numNA(x = "D$LAB_TSC", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) + + +} # } +``` diff --git a/docs/reference/ds.qlspline.html b/docs/reference/ds.qlspline.html index 71b503c1..e98a94f7 100644 --- a/docs/reference/ds.qlspline.html +++ b/docs/reference/ds.qlspline.html @@ -1,55 +1,51 @@ -Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline • dsBaseClientBasis for a piecewise linear spline with meaningful coefficients — ds.qlspline • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function is based on the native R function qlspline from the lspline package. This function computes the basis of piecewise-linear spline such that, depending on the argument marginal, the coefficients can be interpreted as (1) slopes of consecutive spline segments, or (2) slope change at consecutive knots.

    -
    +
    +

    Usage

    ds.qlspline(
       x,
       q,
    @@ -61,8 +57,8 @@ 

    Basis for a piecewise linear spline with meaningful coefficients

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -98,13 +94,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    an object of class "lspline" and "matrix", which its name is specified by the newobj argument (or its default name "qlspline.newobj"), is assigned on the serverside.

    -
    -

    Details

    +
    +

    Details

    If marginal is FALSE (default) the coefficients of the spline correspond to slopes of the consecutive segments. If it is TRUE the first coefficient correspond to the slope of the first segment. The consecutive coefficients correspond to the change @@ -115,28 +111,24 @@

    Details

    of x. Alternatively, q can be a vector of values in [0; 1] specifying the quantile probabilities directly (the vector is passed to argument probs of quantile).

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.qlspline.md b/docs/reference/ds.qlspline.md new file mode 100644 index 00000000..c7405fce --- /dev/null +++ b/docs/reference/ds.qlspline.md @@ -0,0 +1,83 @@ +# Basis for a piecewise linear spline with meaningful coefficients + +This function is based on the native R function `qlspline` from the +`lspline` package. This function computes the basis of piecewise-linear +spline such that, depending on the argument marginal, the coefficients +can be interpreted as (1) slopes of consecutive spline segments, or (2) +slope change at consecutive knots. + +## Usage + +``` r +ds.qlspline( + x, + q, + na.rm = TRUE, + marginal = FALSE, + names = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + the name of the input numeric variable + +- q: + + numeric, a single scalar greater or equal to 2 for a number of + equal-frequency intervals along x or a vector of numbers in (0; 1) + specifying the quantiles explicitly. + +- na.rm: + + logical, whether NA should be removed when calculating quantiles, + passed to na.rm of quantile. Default set to TRUE + +- marginal: + + logical, how to parametrise the spline, see Details + +- names: + + character, vector of names for constructed variables + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `qlspline.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +an object of class "lspline" and "matrix", which its name is specified +by the `newobj` argument (or its default name "qlspline.newobj"), is +assigned on the serverside. + +## Details + +If marginal is FALSE (default) the coefficients of the spline correspond +to slopes of the consecutive segments. If it is TRUE the first +coefficient correspond to the slope of the first segment. The +consecutive coefficients correspond to the change in slope as compared +to the previous segment. Function qlspline wraps lspline and calculates +the knot positions to be at quantiles of x. If q is a numerical scalar +greater or equal to 2, the quantiles are computed at seq(0, 1, +length.out = q + 1)\[-c(1, q+1)\], i.e. knots are at q-tiles of the +distribution of x. Alternatively, q can be a vector of values in \[0; +1\] specifying the quantile probabilities directly (the vector is passed +to argument probs of quantile). + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/ds.quantileMean.html b/docs/reference/ds.quantileMean.html index 0f9781a5..e8789a3e 100644 --- a/docs/reference/ds.quantileMean.html +++ b/docs/reference/ds.quantileMean.html @@ -1,56 +1,55 @@ -Computes the quantiles of a server-side variable — ds.quantileMean • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the mean and quantile values of a server-side quantitative variable.

    -
    -
    ds.quantileMean(x = NULL, type = "combine", datasources = NULL)
    +
    +

    Usage

    +
    ds.quantileMean(
    +  x = NULL,
    +  type = "combine",
    +  datasources = NULL,
    +  classConsistencyCheck = FALSE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -68,14 +67,19 @@

    Arguments

    objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default FALSE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.quantileMean returns to the client-side the quantiles and statistical mean of a server-side numeric vector.

    -
    -

    Details

    +
    +

    Details

    This function does not return the minimum and maximum values because they are potentially disclosive.

    Depending on the argument type can be carried out two types of analysis:
    @@ -84,18 +88,19 @@

    Details

    returned for each study.

    Server functions called: quantileMeanDS, length and numNaDS

    -
    -

    See also

    +
    +

    See also

    ds.mean to compute the statistical mean.

    ds.summary to generate the summary of a variable.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -138,23 +143,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.quantileMean.md b/docs/reference/ds.quantileMean.md new file mode 100644 index 00000000..be71b6c9 --- /dev/null +++ b/docs/reference/ds.quantileMean.md @@ -0,0 +1,112 @@ +# Computes the quantiles of a server-side variable + +This function calculates the mean and quantile values of a server-side +quantitative variable. + +## Usage + +``` r +ds.quantileMean( + x = NULL, + type = "combine", + datasources = NULL, + classConsistencyCheck = FALSE +) +``` + +## Arguments + +- x: + + a character string specifying the name of the numeric vector. + +- type: + + a character that represents the type of graph to display. This can be + set as `'combine'` or `'split'`. For more information see **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default FALSE. + +## Value + +`ds.quantileMean` returns to the client-side the quantiles and +statistical mean of a server-side numeric vector. + +## Details + +This function does not return the minimum and maximum values because +they are potentially disclosive. + +Depending on the argument `type` can be carried out two types of +analysis: +(1) `type = 'combine'` pooled values are displayed +(2) `type = 'split'` summaries are returned for each study. + +Server functions called: `quantileMeanDS`, `length` and `numNaDS` + +## See also + +[`ds.mean`](ds.mean.md) to compute the statistical mean. + +[`ds.summary`](ds.summary.md) to generate the summary of a variable. + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Get the quantiles and mean of a server-side variable + + ds.quantileMean(x = "D$LAB_TRIG", + type = "combine", + datasources = connections) + + + # clear the Datashield R sessions and logout + datashield.logout(connections) + + +} # } +``` diff --git a/docs/reference/ds.rBinom.html b/docs/reference/ds.rBinom.html index 933ce531..67e3e6a5 100644 --- a/docs/reference/ds.rBinom.html +++ b/docs/reference/ds.rBinom.html @@ -1,51 +1,45 @@ -Generates Binomial distribution in the server-side — ds.rBinom • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Generates random (pseudorandom) non-negative integers from a Binomial distribution. Also, ds.rBinom allows creating different vector lengths in each server.

    -
    +
    +

    Usage

    ds.rBinom(
       samp.size = 1,
       size = 0,
    @@ -57,8 +51,8 @@ 

    Generates Binomial distribution in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    samp.size
    @@ -97,8 +91,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.rBinom returns random number vectors with a Binomial distribution for each study, taking into account the values specified in each parameter of the function. @@ -107,8 +101,8 @@

    Value

    random seed vector generated in each source (see info for the argument return.full.seed.as.set).

    -
    -

    Details

    +
    +

    Details

    Creates a vector of random or pseudorandom non-negative integer values distributed with a Binomial distribution. The ds.rBinom function's arguments specify the number of trials, the success probability, the length and the seed of the output @@ -133,13 +127,13 @@

    Details

    vectors one source at a time.

    Server functions called: rBinomDS and setSeedDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       # Connecting to the Opal servers
    @@ -190,23 +184,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rBinom.md b/docs/reference/ds.rBinom.md new file mode 100644 index 00000000..1064b7f9 --- /dev/null +++ b/docs/reference/ds.rBinom.md @@ -0,0 +1,157 @@ +# Generates Binomial distribution in the server-side + +Generates random (pseudorandom) non-negative integers from a Binomial +distribution. Also, `ds.rBinom` allows creating different vector lengths +in each server. + +## Usage + +``` r +ds.rBinom( + samp.size = 1, + size = 0, + prob = 1, + newobj = NULL, + seed.as.integer = NULL, + return.full.seed.as.set = FALSE, + datasources = NULL +) +``` + +## Arguments + +- samp.size: + + an integer value or an integer vector that defines the length of the + random numeric vector to be created in each source. + +- size: + + a positive integer that specifies the number of Bernoulli trials. + +- prob: + + a numeric scalar value or vector in range 0 \> prob \> 1 which + specifies the probability of a positive response (i.e. 1 rather than + 0). + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `rbinom.newobj`. + +- seed.as.integer: + + an integer or a NULL value which provides the random seed in each data + source. + +- return.full.seed.as.set: + + logical, if TRUE will return the full random number seed in each data + source (a numeric vector of length 626). If FALSE it will only return + the trigger seed value you have provided. Default is FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.rBinom` returns random number vectors with a Binomial distribution +for each study, taking into account the values specified in each +parameter of the function. The output vector is written to the +server-side. If requested, it also returned to the client-side the full +626 lengths random seed vector generated in each source (see info for +the argument `return.full.seed.as.set`). + +## Details + +Creates a vector of random or pseudorandom non-negative integer values +distributed with a Binomial distribution. The ds.rBinom function's +arguments specify the number of trials, the success probability, the +length and the seed of the output vector in each source. + +To specify a different `size` in each source, you can use a character +vector `(..., size="vector.of.sizes"...)` or the `datasources` parameter +to create the random vector for one source at a time, changing `size` as +required. The default value for `size = 1` which simulates binary +outcomes (all observations 0 or 1). + +To specify different `prob` in each source, you can use an integer or +character vector `(..., prob="vector.of.probs"...)` or the `datasources` +parameter to create the random vector for one source at a time, changing +`prob` as required. + +If `seed.as.integer` is an integer e.g. 5 and there is more than one +source (N) the seed is set as 5\*N. For example, in the first study the +seed is set as 938\*1, in the second as 938\*2 up to 938\*N in the Nth +study. + +If `seed.as.integer` is set as 0 all sources will start with the seed +value 0 and all the random number generators will, therefore, start from +the same position. Besides, to use the same starting seed in all studies +but do not wish it to be 0, you can use `datasources` argument to +generate the random number vectors one source at a time. + +Server functions called: `rBinomDS` and `setSeedDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Generating the vectors in the Opal servers + ds.rBinom(samp.size=c(13,20,25), #the length of the vector created in each source is different + size=as.character(c(10,23,5)), #Bernoulli trials change in each source + prob=c(0.6,0.1,0.5), #Probability changes in each source + newobj="Binom.dist", + seed.as.integer=45, + return.full.seed.as.set=FALSE, + datasources=connections) #all the Opal servers are used, in this case 3 + #(see above the connection to the servers) + + ds.rBinom(samp.size=15, + size=4, + prob=0.7, + newobj="Binom.dist", + seed.as.integer=324, + return.full.seed.as.set=FALSE, + datasources=connections[2]) #only the second Opal server is used ("study2") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.rNorm.html b/docs/reference/ds.rNorm.html index eda7910f..3a5aa52a 100644 --- a/docs/reference/ds.rNorm.html +++ b/docs/reference/ds.rNorm.html @@ -1,51 +1,45 @@ -Generates Normal distribution in the server-side — ds.rNorm • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Generates normally distributed random (pseudorandom) scalar numbers. Besides, ds.rNorm allows creating different vector lengths in each server.

    -
    +
    +

    Usage

    ds.rNorm(
       samp.size = 1,
       mean = 0,
    @@ -58,8 +52,8 @@ 

    Generates Normal distribution in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    samp.size
    @@ -103,16 +97,16 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.rNorm returns random number vectors with a normal distribution for each study, taking into account the values specified in each parameter of the function. The output vector is written to the server-side. If requested, it also returned to the client-side the full 626 lengths random seed vector generated in each source (see info for the argument return.full.seed.as.set).

    -
    -

    Details

    +
    +

    Details

    Creates a vector of pseudorandom numbers distributed with a Normal distribution in each data source. The ds.rNorm function's arguments specify the mean and the standard deviation @@ -144,13 +138,13 @@

    Details

    The default value of force.output.to.k.decimal.places = 9.

    Server functions called: rNormDS and setSeedDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -205,23 +199,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rNorm.md b/docs/reference/ds.rNorm.md new file mode 100644 index 00000000..0c4dce45 --- /dev/null +++ b/docs/reference/ds.rNorm.md @@ -0,0 +1,170 @@ +# Generates Normal distribution in the server-side + +Generates normally distributed random (pseudorandom) scalar numbers. +Besides, `ds.rNorm` allows creating different vector lengths in each +server. + +## Usage + +``` r +ds.rNorm( + samp.size = 1, + mean = 0, + sd = 1, + newobj = "newObject", + seed.as.integer = NULL, + return.full.seed.as.set = FALSE, + force.output.to.k.decimal.places = 9, + datasources = NULL +) +``` + +## Arguments + +- samp.size: + + an integer value or an integer vector that defines the length of the + random numeric vector to be created in each source. + +- mean: + + the mean value or vector of the Normal distribution to be created. + +- sd: + + the standard deviation of the Normal distribution to be created. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `newObject`. + +- seed.as.integer: + + an integer or a NULL value which provides the random seed in each data + source. + +- return.full.seed.as.set: + + logical, if TRUE will returns the full random number seed in each data + source (a numeric vector of length 626). If FALSE it will only return + the trigger seed value you have provided. Default is FALSE. + +- force.output.to.k.decimal.places: + + an integer vector that forces the output random numbers vector to have + k decimals. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.rNorm` returns random number vectors with a normal distribution for +each study, taking into account the values specified in each parameter +of the function. The output vector is written to the server-side. If +requested, it also returned to the client-side the full 626 lengths +random seed vector generated in each source (see info for the argument +`return.full.seed.as.set`). + +## Details + +Creates a vector of pseudorandom numbers distributed with a Normal +distribution in each data source. The `ds.rNorm` function's arguments +specify the mean and the standard deviation (`sd`) of the normal +distribution and the length and the seed of the output vector in each +source. + +To specify a different `mean` value in each source, you can use a +character vector `(..., mean="vector.of.means"...)` or the `datasources` +parameter to create the random vector for one source at a time, changing +the `mean` as required. Default value for `mean = 0`. + +To specify different `sd` value in each source, you can use a character +vector `(..., sd="vector.of.sds"...` or the `datasources` parameter to +create the random vector for one source at a time, changing the \ +as required. Default value for `sd = 0`. + +If `seed.as.integer` is an integer e.g. 5 and there is more than one +source (N) the seed is set as 5\*N. For example, in the first study the +seed is set as 938\*1, in the second as 938\*2 up to 938\*N in the Nth +study. + +If `seed.as.integer` is set as 0 all sources will start with the seed +value 0 and all the random number generators will, therefore, start from +the same position. Also, to use the same starting seed in all studies +but do not wish it to be 0, you can use `datasources` argument to +generate the random number vectors one source at a time. + +In `force.output.to.k.decimal.places` the range of k is 1-8 decimals. If +`k = 0` the output random numbers are forced to integer. If `k = 9`, no +rounding of output numbers occurs. The default value of +`force.output.to.k.decimal.places = 9`. + +Server functions called: `rNormDS` and `setSeedDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Generating the vectors in the Opal servers + + ds.rNorm(samp.size=c(10,20,45), #the length of the vector created in each source is different + mean=c(1,6,4), #the mean of the Normal distribution changes in each server + sd=as.character(c(1,4,3)), #the sd of the Normal distribution changes in each server + newobj="Norm.dist", + seed.as.integer=2345, + return.full.seed.as.set=FALSE, + force.output.to.k.decimal.places=c(4,5,6), #output random numbers have different + #decimal quantity in each source + datasources=connections) #all the Opal servers are used, in this case 3 + #(see above the connection to the servers) + + ds.rNorm(samp.size=10, + mean=1.4, + sd=0.2, + newobj="Norm.dist", + seed.as.integer=2345, + return.full.seed.as.set=FALSE, + force.output.to.k.decimal.places=1, + datasources=connections[2]) #only the second Opal server is used ("study2") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.rPois.html b/docs/reference/ds.rPois.html index 3127b3bb..eab59cdf 100644 --- a/docs/reference/ds.rPois.html +++ b/docs/reference/ds.rPois.html @@ -1,53 +1,48 @@ -Generates Poisson distribution in the server-side — ds.rPois • dsBaseClientGenerates Poisson distribution in the server-side — ds.rPois • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Generates random (pseudorandom) non-negative integers with a Poisson distribution. Besides, ds.rPois allows creating different vector lengths in each server.

    -
    +
    +

    Usage

    ds.rPois(
       samp.size = 1,
       lambda = 1,
    @@ -58,8 +53,8 @@ 

    Generates Poisson distribution in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    samp.size
    @@ -94,8 +89,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.rPois returns random number vectors with a Poisson distribution for each study, taking into account the values specified in each parameter of the function. The created vectors are stored in the server-side. @@ -103,8 +98,8 @@

    Value

    626 lengths random seed vector generated in each source (see info for the argument return.full.seed.as.set).

    -
    -

    Details

    +
    +

    Details

    Creates a vector of random or pseudorandom non-negative integer values distributed with a Poisson distribution in each data source. The ds.rPois function's arguments specify lambda, @@ -126,13 +121,13 @@

    Details

    vectors one source at a time.

    Server functions called: rPoisDS and setSeedDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    
     if (FALSE) { # \dontrun{
     
    @@ -180,23 +175,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rPois.md b/docs/reference/ds.rPois.md new file mode 100644 index 00000000..143c4f48 --- /dev/null +++ b/docs/reference/ds.rPois.md @@ -0,0 +1,140 @@ +# Generates Poisson distribution in the server-side + +Generates random (pseudorandom) non-negative integers with a Poisson +distribution. Besides, `ds.rPois` allows creating different vector +lengths in each server. + +## Usage + +``` r +ds.rPois( + samp.size = 1, + lambda = 1, + newobj = "newObject", + seed.as.integer = NULL, + return.full.seed.as.set = FALSE, + datasources = NULL +) +``` + +## Arguments + +- samp.size: + + an integer value or an integer vector that defines the length of the + random numeric vector to be created in each source. + +- lambda: + + the number of events mean per interval. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `newObject`. + +- seed.as.integer: + + an integer or a NULL value which provides the random seed in each data + source. + +- return.full.seed.as.set: + + logical, if TRUE will return the full random number seed in each data + source (a numeric vector of length 626). If FALSE it will only return + the trigger seed value you have provided. Default is FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.rPois` returns random number vectors with a Poisson distribution for +each study, taking into account the values specified in each parameter +of the function. The created vectors are stored in the server-side. If +requested, it also returned to the client-side the full 626 lengths +random seed vector generated in each source (see info for the argument +`return.full.seed.as.set`). + +## Details + +Creates a vector of random or pseudorandom non-negative integer values +distributed with a Poisson distribution in each data source. The +`ds.rPois` function's arguments specify lambda, the length and the seed +of the output vector in each source. + +To specify different `lambda` value in each source, you can use a +character vector `(..., lambda = "vector.of.lambdas"...)` or the +`datasources` parameter to create the random vector for one source at a +time, changing `lambda` as required. Default value for `lambda> = 1`. + +If `seed.as.integer` is an integer e.g. 5 and there is more than one +source (N) the seed is set as 5\*N. For example, in the first study the +seed is set as 938\*1, in the second as 938\*2 up to 938\*N in the Nth +study. + +If `seed.as.integer` is set as 0 all sources will start with the seed +value 0 and all the random number generators will, therefore, start from +the same position. Also, to use the same starting seed in all studies +but do not wish it to be 0, you can use `datasources` argument to +generate the random number vectors one source at a time. + +Server functions called: `rPoisDS` and `setSeedDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Generating the vectors in the Opal servers + ds.rPois(samp.size=c(13,20,25), #the length of the vector created in each source is different + lambda=as.character(c(2,3,4)), #different mean per interval (2,3,4) in each source + newobj="Pois.dist", + seed.as.integer=1234, + return.full.seed.as.set=FALSE, + datasources=connections) #all the Opal servers are used, in this case 3 + #(see above the connection to the servers) + ds.rPois(samp.size=13, + lambda=5, + newobj="Pois.dist", + seed.as.integer=1234, + return.full.seed.as.set=FALSE, + datasources=connections[1]) #only the first Opal server is used ("study1") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.rUnif.html b/docs/reference/ds.rUnif.html index 1008dc8b..1cf2a8b0 100644 --- a/docs/reference/ds.rUnif.html +++ b/docs/reference/ds.rUnif.html @@ -1,51 +1,45 @@ -Generates Uniform distribution in the server-side — ds.rUnif • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Generates uniformly distributed random (pseudorandom) scalar numbers. Besides, ds.rUnif allows creating different vector lengths in each server.

    -
    +
    +

    Usage

    ds.rUnif(
       samp.size = 1,
       min = 0,
    @@ -58,8 +52,8 @@ 

    Generates Uniform distribution in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    samp.size
    @@ -105,16 +99,16 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.Unif returns random number vectors with a uniform distribution for each study, taking into account the values specified in each parameter of the function. The created vectors are stored in the server-side. If requested, it also returned to the client-side the full 626 lengths random seed vector generated in each source (see info for the argument return.full.seed.as.set).

    -
    -

    Details

    +
    +

    Details

    It creates a vector of pseudorandom numbers distributed with a uniform probability in each data source. The ds.Unif function's arguments specify @@ -149,13 +143,13 @@

    Details

    Default value for k = 9.

    Server functions called: rUnifDS and setSeedDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    
     if (FALSE) { # \dontrun{
     
    @@ -211,23 +205,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rUnif.md b/docs/reference/ds.rUnif.md new file mode 100644 index 00000000..92271e19 --- /dev/null +++ b/docs/reference/ds.rUnif.md @@ -0,0 +1,173 @@ +# Generates Uniform distribution in the server-side + +Generates uniformly distributed random (pseudorandom) scalar numbers. +Besides, `ds.rUnif` allows creating different vector lengths in each +server. + +## Usage + +``` r +ds.rUnif( + samp.size = 1, + min = 0, + max = 1, + newobj = "newObject", + seed.as.integer = NULL, + return.full.seed.as.set = FALSE, + force.output.to.k.decimal.places = 9, + datasources = NULL +) +``` + +## Arguments + +- samp.size: + + an integer value or an integer vector that defines the length of the + random numeric vector to be created in each source. + +- min: + + a numeric scalar that specifies the minimum value of the random + numbers in the distribution. + +- max: + + a numeric scalar that specifies the maximum value of the random + numbers in the distribution. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `newObject`. + +- seed.as.integer: + + an integer or a NULL value which provides the random seed in each data + source. + +- return.full.seed.as.set: + + logical, if TRUE will return the full random number seed in each data + source (a numeric vector of length 626). If FALSE it will only return + the trigger seed value you have provided. Default is FALSE. + +- force.output.to.k.decimal.places: + + an integer or an integer vector that forces the output random numbers + vector to have k decimals. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.Unif` returns random number vectors with a uniform distribution for +each study, taking into account the values specified in each parameter +of the function. The created vectors are stored in the server-side. If +requested, it also returned to the client-side the full 626 lengths +random seed vector generated in each source (see info for the argument +`return.full.seed.as.set`). + +## Details + +It creates a vector of pseudorandom numbers distributed with a uniform +probability in each data source. The `ds.Unif` function's arguments +specify the minimum and maximum of the uniform distribution and the +length and the seed of the output vector in each source. + +To specify different `min` values in each source, you can use a +character vector `(..., min="vector.of.mins"...)` or the `datasources` +parameter to create the random vector for one source at a time, changing +the `min` value as required. Default value for `min = 0`. + +To specify different `max` values in each source, you can use a +character vector `(..., max="vector.of.maxs"...)` or the `datasources` +parameter to create the random vector for one source at a time, changing +the `max` value as required. Default value for `max = 1`. + +If `seed.as.integer` is an integer e.g. 5 and there is more than one +source (N) the seed is set as 5\*N. For example, in the first study the +seed is set as 938\*1, in the second as 938\*2 up to 938\*N in the Nth +study. + +If `seed.as.integer` is set as 0 all sources will start with the seed +value 0 and all the random number generators will, therefore, start from +the same position. Also, to use the same starting seed in all studies +but do not wish it to be 0, you can use `datasources` argument to +generate the random number vectors one source at a time. + +In `force.output.to.k.decimal.places` the range of k is 1-8 decimals. If +`k = 0` the output random numbers are forced to an integer. If `k = 9`, +no rounding of output numbers occurs. The default value of +`force.output.to.k.decimal.places = 9`. If you wish to generate integers +with equal probabilities in the range 1-10 you should specify +`min = 0.5` and `max = 10.5`. Default value for `k = 9`. + +Server functions called: `rUnifDS` and `setSeedDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Generating the vectors in the Opal servers + + ds.rUnif(samp.size = c(12,20,4), #the length of the vector created in each source is different + min = as.character(c(0,2,5)), #different minumum value of the function in each source + max = as.character(c(2,5,9)), #different maximum value of the function in each source + newobj = "Unif.dist", + seed.as.integer = 234, + return.full.seed.as.set = FALSE, + force.output.to.k.decimal.places = c(1,2,3), + datasources = connections) #all the Opal servers are used, in this case 3 + #(see above the connection to the servers) + + ds.rUnif(samp.size = 12, + min = 0, + max = 2, + newobj = "Unif.dist", + seed.as.integer = 12345, + return.full.seed.as.set = FALSE, + force.output.to.k.decimal.places = 2, + datasources = connections[2]) #only the second Opal server is used ("study2") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } + +``` diff --git a/docs/reference/ds.rbind.html b/docs/reference/ds.rbind.html index 2f68e9a8..eaff4d7f 100644 --- a/docs/reference/ds.rbind.html +++ b/docs/reference/ds.rbind.html @@ -1,51 +1,45 @@ -Combines R objects by rows in the server-side — ds.rbind • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    It takes a sequence of vector, matrix or data-frame arguments and combines them by rows to produce a matrix.

    -
    +
    +

    Usage

    ds.rbind(
       x = NULL,
       DataSHIELD.checks = FALSE,
    @@ -56,8 +50,8 @@ 

    Combines R objects by rows in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -90,16 +84,16 @@

    Arguments

    progress. Default FALSE.

    -
    -

    Value

    +
    +

    Value

    ds.rbind returns a matrix combining the rows of the R objects specified in the function which is written to the server-side. It also returns two messages to the client-side with the name of newobj that has been created in each data source and DataSHIELD.checks result.

    -
    -

    Details

    +
    +

    Details

    A sequence of vector, matrix or data-frame arguments is combined by rows to produce a matrix on the server-side.

    In DataSHIELD.checks the checks are relatively slow. @@ -110,13 +104,13 @@

    Details

    the columns in the output object.

    Server functions called: rbindDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    
     if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki 
    @@ -163,23 +157,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rbind.md b/docs/reference/ds.rbind.md new file mode 100644 index 00000000..7ef2d208 --- /dev/null +++ b/docs/reference/ds.rbind.md @@ -0,0 +1,124 @@ +# Combines R objects by rows in the server-side + +It takes a sequence of vector, matrix or data-frame arguments and +combines them by rows to produce a matrix. + +## Usage + +``` r +ds.rbind( + x = NULL, + DataSHIELD.checks = FALSE, + force.colnames = NULL, + newobj = NULL, + datasources = NULL, + notify.of.progress = FALSE +) +``` + +## Arguments + +- x: + + a character vector with the name of the objects to be combined. + +- DataSHIELD.checks: + + logical, if TRUE checks that all input objects exist and are of an + appropriate class. + +- force.colnames: + + can be NULL or a vector of characters that specifies column names of + the output object. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Defaults `rbind.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- notify.of.progress: + + specifies if console output should be produced to indicate progress. + Default FALSE. + +## Value + +`ds.rbind` returns a matrix combining the rows of the R objects +specified in the function which is written to the server-side. It also +returns two messages to the client-side with the name of `newobj` that +has been created in each data source and `DataSHIELD.checks` result. + +## Details + +A sequence of vector, matrix or data-frame arguments is combined by rows +to produce a matrix on the server-side. + +In `DataSHIELD.checks` the checks are relatively slow. Default +`DataSHIELD.checks` value is FALSE. + +If `force.colnames` is NULL column names are inferred from the names or +column names of the first object specified in the `x` argument. The +vector of column names must have the same number of elements as the +columns in the output object. + +Server functions called: `rbindDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Combining R objects by rows + + + ds.rbind(x = "D", #data frames in the server-side to be conbined + #(see above the connection to the Opal servers) + DataSHIELD.checks = FALSE, + force.colnames = NULL, + newobj = "D.rbind", # name for the output object that is stored in the data servers + datasources = connections, # All Opal servers are used + #(see above the connection to the Opal servers) + notify.of.progress = FALSE) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } +``` diff --git a/docs/reference/ds.reShape.html b/docs/reference/ds.reShape.html index e91469c7..16972b5b 100644 --- a/docs/reference/ds.reShape.html +++ b/docs/reference/ds.reShape.html @@ -1,51 +1,45 @@ -Reshapes server-side grouped data — ds.reShape • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Reshapes a data frame containing longitudinal or otherwise grouped data from 'wide' to 'long' format or vice-versa.

    -
    +
    +

    Usage

    ds.reShape(
       data.name = NULL,
       varying = NULL,
    @@ -60,8 +54,8 @@ 

    Reshapes server-side grouped data

    )
    -
    -

    Arguments

    +
    +

    Arguments

    data.name
    @@ -119,16 +113,16 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.reShape returns to the server-side a reshaped data frame converted from 'long' to 'wide' format or from 'wide' to long' format. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function is based on the native R function reshape. It reshapes a data frame containing longitudinal or otherwise grouped data between 'wide' format with repeated @@ -136,13 +130,13 @@

    Details

    measurements in separate records. The reshaping can be in either direction. Server function called: reShapeDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see Wiki
    @@ -186,23 +180,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.reShape.md b/docs/reference/ds.reShape.md new file mode 100644 index 00000000..669b9bb3 --- /dev/null +++ b/docs/reference/ds.reShape.md @@ -0,0 +1,148 @@ +# Reshapes server-side grouped data + +Reshapes a data frame containing longitudinal or otherwise grouped data +from 'wide' to 'long' format or vice-versa. + +## Usage + +``` r +ds.reShape( + data.name = NULL, + varying = NULL, + v.names = NULL, + timevar.name = "time", + idvar.name = "id", + drop = NULL, + direction = NULL, + sep = ".", + newobj = "newObject", + datasources = NULL +) +``` + +## Arguments + +- data.name: + + a character string specifying the name of the data frame to be + reshaped. + +- varying: + + names of sets of variables in the wide format that correspond to + single variables in 'long' format. + +- v.names: + + the names of variables in the 'long' format that correspond to + multiple variables in the 'wide' format. + +- timevar.name: + + the variable in 'long' format that differentiates multiple records + from the same group or individual. If more than one record matches, + the first will be taken. + +- idvar.name: + + names of one or more variables in 'long' format that identify multiple + records from the same group/individual. These variables may also be + present in 'wide' format. + +- drop: + + a vector of names of variables to drop before reshaping. This can + simplify the resultant output. + +- direction: + + a character string that partially matched to either 'wide' to reshape + from 'long' to 'wide' format, or 'long' to reshape from 'wide' to + 'long' format. + +- sep: + + a character vector of length 1, indicating a separating character in + the variable names in the 'wide' format. This is used for creating + good `v.names` and times arguments based on the names in the `varying` + argument. This is also used to create variable names when reshaping to + 'wide' format. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `reshape.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.reShape` returns to the server-side a reshaped data frame converted +from 'long' to 'wide' format or from 'wide' to long' format. Also, two +validity messages are returned to the client-side indicating whether the +new object has been created in each data source and if so whether it is +in a valid form. + +## Details + +This function is based on the native R function `reshape`. It reshapes a +data frame containing longitudinal or otherwise grouped data between +'wide' format with repeated measurements in separate columns of the same +record and 'long' format with the repeated measurements in separate +records. The reshaping can be in either direction. Server function +called: `reShapeDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "SURVIVAL.EXPAND_NO_MISSING3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Reshape server-side grouped data + + ds.reShape(data.name = "D", + v.names = "age.60", + timevar.name = "time.id", + idvar.name = "id", + direction = "wide", + newobj = "reshape1_obj", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.recodeLevels.html b/docs/reference/ds.recodeLevels.html index 70c5d8d1..0c4871bd 100644 --- a/docs/reference/ds.recodeLevels.html +++ b/docs/reference/ds.recodeLevels.html @@ -1,49 +1,42 @@ -Recodes the levels of a server-side factor vector — ds.recodeLevels • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function replaces the levels of a factor by the specified new ones.

    -
    +
    +

    Usage

    ds.recodeLevels(
       x = NULL,
       newCategories = NULL,
    @@ -52,8 +45,8 @@ 

    Recodes the levels of a server-side factor vector

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -76,25 +69,26 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.recodeLevels returns to the server-side a variable of type factor with the replaces levels.

    -
    -

    Details

    +
    +

    Details

    This function is similar to native R function levels().

    It can for example be used to merge two classes into one, to add a level(s) to a vector or to rename (i.e. re-label) the levels of a vector.

    Server function called: levels()

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -136,23 +130,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.recodeLevels.md b/docs/reference/ds.recodeLevels.md new file mode 100644 index 00000000..05389a48 --- /dev/null +++ b/docs/reference/ds.recodeLevels.md @@ -0,0 +1,103 @@ +# Recodes the levels of a server-side factor vector + +The function replaces the levels of a factor by the specified new ones. + +## Usage + +``` r +ds.recodeLevels( + x = NULL, + newCategories = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string specifying the name of a factor variable. + +- newCategories: + + a character vector specifying the new levels. Its length must be equal + or greater to the current number of levels. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `recodelevels.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.recodeLevels` returns to the server-side a variable of type factor +with the replaces levels. + +## Details + +This function is similar to native R function +[`levels()`](https://rdrr.io/r/base/levels.html). + +It can for example be used to merge two classes into one, to add a +level(s) to a vector or to rename (i.e. re-label) the levels of a +vector. + +Server function called: [`levels()`](https://rdrr.io/r/base/levels.html) + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Recode the levels of a factor variable + + ds.recodeLevels(x = "D$PM_BMI_CATEGORICAL", + newCategories = c("1","2","3"), + newobj = "BMI_CAT", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.recodeValues.html b/docs/reference/ds.recodeValues.html index 6a047e4c..fdc2d318 100644 --- a/docs/reference/ds.recodeValues.html +++ b/docs/reference/ds.recodeValues.html @@ -1,51 +1,45 @@ -Recodes server-side variable values — ds.recodeValues • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function takes specified values of elements in a vector and converts them to a matched set of alternative specified values.

    -
    +
    +

    Usage

    ds.recodeValues(
       var.name = NULL,
       values2replace.vector = NULL,
    @@ -57,8 +51,8 @@ 

    Recodes server-side variable values

    )
    -
    -

    Arguments

    +
    +

    Arguments

    var.name
    @@ -98,15 +92,15 @@

    Arguments

    progress. Default FALSE.

    -
    -

    Value

    +
    +

    Value

    Assigns to each server a new variable with the recoded values. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function recodes individual values with new individual values. This can apply to numeric and character values, factor levels and NAs. One particular use of ds.recodeValues is to convert NAs to an explicit value. This value is specified @@ -115,32 +109,28 @@

    Details

    and new.values.vector (see Example 2 below). Server function called: recodeValuesDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.recodeValues.md b/docs/reference/ds.recodeValues.md new file mode 100644 index 00000000..150c3120 --- /dev/null +++ b/docs/reference/ds.recodeValues.md @@ -0,0 +1,83 @@ +# Recodes server-side variable values + +This function takes specified values of elements in a vector and +converts them to a matched set of alternative specified values. + +## Usage + +``` r +ds.recodeValues( + var.name = NULL, + values2replace.vector = NULL, + new.values.vector = NULL, + missing = NULL, + newobj = NULL, + datasources = NULL, + notify.of.progress = FALSE +) +``` + +## Arguments + +- var.name: + + a character string providing the name of the variable to be recoded. + +- values2replace.vector: + + a numeric or character vector specifying the values in the variable + `var.name` to be replaced. + +- new.values.vector: + + a numeric or character vector specifying the new values. + +- missing: + + If supplied, any missing values in var.name will be replaced by this + value. Must be of length 1. If the analyst want to recode only missing + values then it should also specify an identical vector of values in + both arguments `values2replace.vector` and `new.values.vector`. + Otherwise please look the `ds.replaceNA` function. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `recodevalues.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- notify.of.progress: + + logical. If TRUE console output should be produced to indicate + progress. Default FALSE. + +## Value + +Assigns to each server a new variable with the recoded values. Also, two +validity messages are returned to the client-side indicating whether the +new object has been created in each data source and if so whether it is +in a valid form. + +## Details + +This function recodes individual values with new individual values. This +can apply to numeric and character values, factor levels and NAs. One +particular use of `ds.recodeValues` is to convert NAs to an explicit +value. This value is specified in the argument `missing`. If the user +want to recode only missing values, then it should also specify an +identical vector of values in both arguments `values2replace.vector` and +`new.values.vector` (see Example 2 below). Server function called: +`recodeValuesDS` + +## Author + +DataSHIELD Development Team + +## Examples diff --git a/docs/reference/ds.rep.html b/docs/reference/ds.rep.html index cff47518..6e74bd81 100644 --- a/docs/reference/ds.rep.html +++ b/docs/reference/ds.rep.html @@ -1,51 +1,45 @@ -Creates a repetitive sequence in the server-side — ds.rep • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Creates a repetitive sequence by repeating the specified scalar number, vector or list in each data source.

    -
    +
    +

    Usage

    ds.rep(
       x1 = NULL,
       times = NA,
    @@ -61,8 +55,8 @@ 

    Creates a repetitive sequence in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x1
    @@ -116,27 +110,27 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.rep returns in the server-side a vector with the specified repetitive sequence. Also, two validity messages are returned to the client-side the name of newobj that has been created in each data source and if it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    All arguments that can denote in a clientside or a serverside (i.e. x1, times, length.out or each).

    Server function called: repDS.

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -198,23 +192,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rep.md b/docs/reference/ds.rep.md new file mode 100644 index 00000000..fac7c46e --- /dev/null +++ b/docs/reference/ds.rep.md @@ -0,0 +1,155 @@ +# Creates a repetitive sequence in the server-side + +Creates a repetitive sequence by repeating the specified scalar number, +vector or list in each data source. + +## Usage + +``` r +ds.rep( + x1 = NULL, + times = NA, + length.out = NA, + each = 1, + source.x1 = "clientside", + source.times = NULL, + source.length.out = NULL, + source.each = NULL, + x1.includes.characters = FALSE, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- x1: + + an scalar number, vector or list. + +- times: + + an integer from clientside or a serverside integer or vector. + +- length.out: + + a clientside integer or a serverside integer or vector. + +- each: + + a clientside or serverside integer. + +- source.x1: + + the source `x1` argument. It can be "clientside" or "c" and serverside + or "s". + +- source.times: + + see `source.x1` + +- source.length.out: + + see `source.x1` + +- source.each: + + see `source.x1` + +- x1.includes.characters: + + Boolean parameter which specifies if the `x1` is a character. + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `seq.vect`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.rep` returns in the server-side a vector with the specified +repetitive sequence. Also, two validity messages are returned to the +client-side the name of `newobj` that has been created in each data +source and if it is in a valid form. + +## Details + +All arguments that can denote in a clientside or a serverside (i.e. +`x1`, `times`, `length.out` or `each`). + +Server function called: `repDS`. + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, + assign = TRUE, + symbol = "D") + + # Creating a repetitive sequence + + ds.rep(x1 = 4, + times = 6, + length.out = NA, + each = 1, + source.x1 = "clientside", + source.times = "c", + source.length.out = NULL, + source.each = "c", + x1.includes.characters = FALSE, + newobj = "rep.seq", + datasources = connections) + + ds.rep(x1 = "lung", + times = 6, + length.out = 7, + each = 1, + source.x1 = "clientside", + source.times = "c", + source.length.out = "c", + source.each = "c", + x1.includes.characters = TRUE, + newobj = "rep.seq", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.replaceNA.html b/docs/reference/ds.replaceNA.html index 79fb2aa6..8633a0fa 100644 --- a/docs/reference/ds.replaceNA.html +++ b/docs/reference/ds.replaceNA.html @@ -1,56 +1,50 @@ -Replaces the missing values in a server-side vector — ds.replaceNA • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function identifies missing values and replaces them by a value or values specified by the analyst.

    -
    +
    +

    Usage

    ds.replaceNA(x = NULL, forNA = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -73,14 +67,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.replaceNA returns to the server-side a new vector or table structure with the missing values replaced by the specified values. The class of the vector is the same as the initial vector.

    -
    -

    Details

    +
    +

    Details

    This function is used when the analyst prefers or requires complete vectors. It is then possible the specify one value for each missing value by first returning the number of missing values using the function ds.numNA but in most cases, @@ -92,13 +86,14 @@

    Details

    missing values.

    Server function called: replaceNaDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -162,23 +157,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.replaceNA.md b/docs/reference/ds.replaceNA.md new file mode 100644 index 00000000..e87587bd --- /dev/null +++ b/docs/reference/ds.replaceNA.md @@ -0,0 +1,128 @@ +# Replaces the missing values in a server-side vector + +This function identifies missing values and replaces them by a value or +values specified by the analyst. + +## Usage + +``` r +ds.replaceNA(x = NULL, forNA = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of the vector. + +- forNA: + + a list or a vector that contains the replacement value(s), for each + study. The length of the list or vector must be equal to the number of + servers (studies). + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `replacena.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.replaceNA` returns to the server-side a new vector or table +structure with the missing values replaced by the specified values. The +class of the vector is the same as the initial vector. + +## Details + +This function is used when the analyst prefers or requires complete +vectors. It is then possible the specify one value for each missing +value by first returning the number of missing values using the function +`ds.numNA` but in most cases, it might be more sensible to replace all +missing values by one specific value e.g. replace all missing values in +a vector by the mean or median value. Once the missing values have been +replaced a new vector is created. + +**Note**: If the vector is within a table structure such as a data frame +the new vector is appended to table structure so that the table holds +both the vector with and without missing values. + +Server function called: `replaceNaDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Replace missing values in variable 'LAB_HDL' by the mean value + # in each study + + # Get the mean value of 'LAB_HDL' for each study + mean <- ds.mean(x = "D$LAB_HDL", + type = "split", + datasources = connections) + + # Replace the missing values using the mean for each study + ds.replaceNA(x = "D$LAB_HDL", + forNA = list(mean[[1]][1], mean[[1]][2], mean[[1]][3]), + newobj = "HDL.noNA", + datasources = connections) + + # Example 2: Replace missing values in categorical variable 'PM_BMI_CATEGORICAL' + # with 999s + + # First check how many NAs there are in 'PM_BMI_CATEGORICAL' in each study + ds.table(rvar = "D$PM_BMI_CATEGORICAL", + useNA = "always") + + # Replace the missing values with 999s + ds.replaceNA(x = "D$PM_BMI_CATEGORICAL", + forNA = c(999,999,999), + newobj = "bmi999") + + # Check if the NAs have been replaced correctly + ds.table(rvar = "bmi999", + useNA = "always") + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.rm.html b/docs/reference/ds.rm.html index 4685a78f..a4c17137 100644 --- a/docs/reference/ds.rm.html +++ b/docs/reference/ds.rm.html @@ -1,54 +1,47 @@ -Deletes server-side R objects — ds.rm • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    deletes R objects on the server-side

    -
    +
    +

    Usage

    ds.rm(x.names = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.names
    @@ -61,15 +54,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    The ds.rm function deletes from the server-side the specified object. If this is successful the message "Object(s) '<x.names>' was deleted." is returned to the client-side.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the native R function rm().

    The fact that it is an aggregate @@ -82,13 +75,13 @@

    Details

    this calls an aggregate function there is no type argument.

    Server function called: rmDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -132,23 +125,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rm.md b/docs/reference/ds.rm.md new file mode 100644 index 00000000..285a7117 --- /dev/null +++ b/docs/reference/ds.rm.md @@ -0,0 +1,95 @@ +# Deletes server-side R objects + +deletes R objects on the server-side + +## Usage + +``` r +ds.rm(x.names = NULL, datasources = NULL) +``` + +## Arguments + +- x.names: + + a character string specifying the objects to be deleted. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +The `ds.rm` function deletes from the server-side the specified object. +If this is successful the message `"Object(s) '' was deleted."` +is returned to the client-side. + +## Details + +This function is similar to the native R function +[`rm()`](https://rdrr.io/r/base/rm.html). + +The fact that it is an aggregate function may be surprising because it +modifies an object on the server-side, and would, therefore, be expected +to be an assign function. However, as an assign function the last step +in running it would be to write the modified object as `newobj`. But +this would fail because the effect of the function is to delete the +object and so it would be impossible to write it anywhere. Please note +that although this calls an aggregate function there is no `type` +argument. + +Server function called: `rmDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create an object in the server-side + + ds.assign(toAssign = "D$LAB_TSC", + newobj = "labtsc", + datasources = connections) + + #Delete "labtsc" object from the server-side + + ds.rm(x.names = "labtsc", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.rowColCalc.html b/docs/reference/ds.rowColCalc.html index 24460263..1dcfdd68 100644 --- a/docs/reference/ds.rowColCalc.html +++ b/docs/reference/ds.rowColCalc.html @@ -1,56 +1,50 @@ -Computes rows and columns sums and means in the server-side — ds.rowColCalc • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Computes sums and means of rows or columns of a numeric matrix or data frame on the server-side.

    -
    +
    +

    Usage

    ds.rowColCalc(x = NULL, operation = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -73,25 +67,26 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.rowColCalc returns to the server-side rows and columns sums and means.

    -
    -

    Details

    +
    +

    Details

    The function is similar to R base functions rowSums, colSums, rowMeans and colMeans with some restrictions.

    The results of the calculation are not returned to the user if they are potentially revealing i.e. if the number of rows is less than the allowed number of observations.

    Server functions called: classDS, dimDS and colnamesDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki 
    @@ -135,23 +130,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.rowColCalc.md b/docs/reference/ds.rowColCalc.md new file mode 100644 index 00000000..f179b59e --- /dev/null +++ b/docs/reference/ds.rowColCalc.md @@ -0,0 +1,102 @@ +# Computes rows and columns sums and means in the server-side + +Computes sums and means of rows or columns of a numeric matrix or data +frame on the server-side. + +## Usage + +``` r +ds.rowColCalc(x = NULL, operation = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of a matrix or a data frame. + +- operation: + + a character string that indicates the operation to carry out: + `"rowSums"`, `"colSums"`, `"rowMeans"` or `"colMeans"`. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `rowcolcalc.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.rowColCalc` returns to the server-side rows and columns sums and +means. + +## Details + +The function is similar to R base functions `rowSums`, `colSums`, +`rowMeans` and `colMeans` with some restrictions. + +The results of the calculation are not returned to the user if they are +potentially revealing i.e. if the number of rows is less than the +allowed number of observations. + +Server functions called: `classDS`, `dimDS` and `colnamesDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + myvar <- list("LAB_TSC","LAB_HDL") + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, + variables = myvar, symbol = "D") + + + #Calculate the colSums + + ds.rowColCalc(x = "D", + operation = "colSums", + newobj = "D.rowSums", + datasources = connections) + + #Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.sample.html b/docs/reference/ds.sample.html index c3832a02..e7f92678 100644 --- a/docs/reference/ds.sample.html +++ b/docs/reference/ds.sample.html @@ -1,53 +1,48 @@ -Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample • dsBaseClientPerforms random sampling and permuting of vectors, dataframes and matrices — ds.sample • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    draws a pseudorandom sample from a vector, dataframe or matrix on the serverside or - as a special case - randomly permutes a vector, dataframe or matrix.

    -
    +
    +

    Usage

    ds.sample(
       x = NULL,
       size = NULL,
    @@ -60,8 +55,8 @@ 

    Performs random sampling and permuting of vectors, dataframes and matrices)

    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -152,8 +147,8 @@

    Arguments

    progress. The default value for notify.of.progress is FALSE.

    -
    -

    Value

    +
    +

    Value

    the object specified by the <newobj> argument (or default name 'newobj.sample') which is written to the serverside. In addition, two validity messages are returned @@ -164,8 +159,8 @@

    Value

    the full output object. We are currently working to extend the information that can be returned to the clientside when an error occurs.

    -
    -

    Details

    +
    +

    Details

    Clientside function ds.sample calls serverside assign function sampleDS. Based on the native R function sample() but deals slightly differently with data.frames and matrices. Specifically the sample() @@ -221,28 +216,24 @@

    Details

    fail using the usual value for 'nfilter.stringShort' (i.e. 20). This is why line 2 is inserted to create a copy with a shorter name.

    -
    -

    Author

    +
    +

    Author

    Paul Burton, for DataSHIELD Development Team, 15/4/2020

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.sample.md b/docs/reference/ds.sample.md new file mode 100644 index 00000000..fe615b7e --- /dev/null +++ b/docs/reference/ds.sample.md @@ -0,0 +1,194 @@ +# Performs random sampling and permuting of vectors, dataframes and matrices + +draws a pseudorandom sample from a vector, dataframe or matrix on the +serverside or - as a special case - randomly permutes a vector, +dataframe or matrix. + +## Usage + +``` r +ds.sample( + x = NULL, + size = NULL, + seed.as.integer = NULL, + replace = FALSE, + prob = NULL, + newobj = NULL, + datasources = NULL, + notify.of.progress = FALSE +) +``` + +## Arguments + +- x: + + Either a character string providing the name for the serverside + vector, matrix or data.frame to be sampled or permuted, or an + integer/numeric scalar (e.g. 923) indicating that one should create a + new vector on the serverside that is a randomly permuted sample of the + vector 1:923, or (if \[replace\] = FALSE, a full random permutation of + that same vector. For further details of using ds.sample with x set as + an integer/numeric please see help for the `sample` function in + native R. But if x is set as a character string denoting a vector, + matrix or data.frame on the serverside, please note that although + `ds.sample` effectively calls `sample` on the serverside it behaves + somewhat differently to `sample` - for the reasons identified at the + top of 'details' and so help for `sample` should be used as a guide + only. + +- size: + + a numeric/integer scalar indicating the size of the sample to be + drawn. If the \[x\] argument is a vector, matrix or data.frame on the + serverside and if the \[size\] argument is set either to 0 or to the + length of the object to be 'sampled' and \[replace\] is FALSE, then + ds.sample will draw a random sample that includes all rows of the + input object but will randomly permute them. If the \[x\] argument is + numeric (e.g. 923) and size is either undefined or set equal to 923, + the output on the serverside will be a vector of length 923 permuted + into a random order. If the \[replace\] argument is FALSE then the + value of \[size\] must be no greater than the length of object to be + sorted - if this is violated an error message will be returned. + +- seed.as.integer: + + this is precisely equivalent to the \[seed.as.integer\] arguments for + the pseudo-random number generating functions (e.g. also see help for + ds.rBinom, ds.rNorm, ds.rPois and ds.rUnif). In other words the + seed.as.integer argument is either a a numeric scalar or a NULL which + primes the random seed in each data source. If \ is + a numeric scalar (e.g. 938) the seed in each study is set as 938\*1 in + the first study in the set of data sources being used, 938\*2 in the + second, up to 938\*N in the Nth study. If \ is set + as 0 all sources will start with the seed value 0 and all the random + number generators will therefore start from the same position. If you + want to use the same starting seed in all studies but do not wish it + to be 0, you can specify a non-zero scalar value for + \ and then use the \ argument to + generate the random number vectors one source at a time (e.g. + ,datasources=default.opals\[2\] to generate the random vector in + source 2). As an example, if the \ value is 78326 + then the seed in each source will be set at 78326\*1 = 78326 because + the vector of datasources being used in each call to the function will + always be of length 1 and so the source-specific seed multiplier will + also be 1. The function ds.rUnif.o calls the serverside assign + function setSeedDS.o to create the random seeds in each source + +- replace: + + a Boolean indicator (TRUE or FALSE) specifying whether the sample + should be drawn with or without replacement. Default is FALSE so the + sample is drawn without replacement. For further details see help for + `sample` in native R. + +- prob: + + a character string containing the name of a numeric vector of + probability weights on the serverside that is associated with each of + the elements of the vector to be sampled enabling the drawing of a + sample with some elements given higher probability of being drawn than + others. For further details see help for `sample` in native R. + +- newobj: + + This a character string providing a name for the output data.frame + which defaults to 'newobj.sample' if no name is specified. + +- datasources: + + specifies the particular opal object(s) to use. If the \ + argument is not specified the default set of opals will be used. The + default opals are called default.opals and the default can be set + using the function `ds.setDefaultOpals`. If the \ is to + be specified, it should be set without inverted commas: e.g. + datasources=opals.em or datasources=default.opals. If you wish to + apply the function solely to e.g. the second opal server in a set of + three, the argument can be specified as: e.g. + datasources=opals.em\[2\]. If you wish to specify the first and third + opal servers in a set you specify: e.g. datasources=opals.em\[c(1,3)\] + +- notify.of.progress: + + specifies if console output should be produce to indicate progress. + The default value for notify.of.progress is FALSE. + +## Value + +the object specified by the \ argument (or default name +'newobj.sample') which is written to the serverside. In addition, two +validity messages are returned indicating whether \ has been +created in each data source and if so whether it is in a valid form. If +its form is not valid in at least one study - e.g. because a disclosure +trap was tripped and creation of the full output object was blocked - +ds.dataFrameSort() also returns any studysideMessages that may explain +the error in creating the full output object. We are currently working +to extend the information that can be returned to the clientside when an +error occurs. + +## Details + +Clientside function ds.sample calls serverside assign function sampleDS. +Based on the native R function +[`sample()`](https://rdrr.io/r/base/sample.html) but deals slightly +differently with data.frames and matrices. Specifically the +[`sample()`](https://rdrr.io/r/base/sample.html) function in R +identifies the length of an object and then samples n components of that +length. But length(data.frame) in native R returns the number of columns +not the number of rows. So if you have a data.frame with 71 rows and 10 +columns, the sample() function will select 10 columns at random, which +is often not what is required. So, ds.sample(x="data.frame",size=10) in +DataSHIELD will sample 10 rows at random(with or without replacement +depending whether the \[replace\] argument is TRUE or FALSE, with False +being default). If x is a simple vector or a matrix it is first coerced +to a data.frame on the serverside and so is dealt with in the same way +(i.e. random selection of 10 rows). If x is an integer not expressed as +a character string, it is dealt with in exactly the same way as in +native R. That is, if x = 923 and size=117, DataSHIELD will draw a +random sample in random order of size 117 from the vector 1:923 (i.e. 1, +2, ... ,923) with or without replacement depending whether \[replace\] +is TRUE or FALSE. If the \[x\] argument is numeric (e.g. 923) and size +is either undefined or set equal to 923, the output on the serverside +will be a vector of length 923 permuted into a random order. If the +\[x\] argument is a vector, matrix or data.frame on the serverside and +if the \[size\] argument is set either to 0 or to the length of the +object to be 'sampled' and \[replace\] is FALSE, then ds.sample will +draw a random sample that includes all rows of the input object but will +randomly permute them. This is how ds.sample enables random permuting as +well as random sub-sampling. When a serverside vector, matrix or +data.frame is sampled using ds.sample 3 new columns are appended to the +right of the output object. These are: 'in.sample', 'ID.seq', and +'sampling.order'. The first of these is set to 1 whenever a row enters +the sample and as a QA test, all values in that column in the output +object should be 1. 'ID.seq' is a sequential numeric ID appended to the +right of the object to be sampled during the running of ds.sample that +runs from 1 to the length of the object and will be appended even if +there is already an equivalent sequential ID in the object. The output +object is stored in the same original order as it was before sampling, +and so if the first four elements of 'ID.seq' are 3,4, 6, 15 ... then it +means that rows 1 and 2 were not included in the random sample, but rows +3, 4 were. Row 5 was not included, 6 was included and rows 7-14 were not +etc. The 'sampling.order' vector is of class numeric and indicates the +order in which the rows entered the sample: 1 indicates the first row +sample, 2 the second etc. The lines of code that follow create an output +object of the same length as the input object (PRWa) but they join the +sample in random order. By sorting the output object (in this case with +the default name 'newobj.sample) using ds.dataFrameSort with the +'sampling.order' vector as the sort key, the output object is rendered +equivalent to PRWa but with the rows randomly permuted (so the column +reflecting the vector 'sample.order' now runs from 1:length of object, +while the column reflecting 'ID.seq' denoting the original order is now +randomly ordered. If you need to return to the original order you can +simply us ds.dataFrameSort again using the column reflecting 'ID.seq' as +the sort key: (1) ds.sample('PRWa',size=0,seed.as.integer = 256); (2) +ds.make("newobj.sample\$sampling.order","sortkey"); (3) +ds.dataFrameSort("newobj.sample","sortkey",newobj="newobj.permuted") The +only additional detail to note is that the original name of the sort key +("newobj.sample\$sampling.order") is 28 characters long, and because its +length is tested to check for disclosure risk, this original name will +fail using the usual value for 'nfilter.stringShort' (i.e. 20). This is +why line 2 is inserted to create a copy with a shorter name. + +## Author + +Paul Burton, for DataSHIELD Development Team, 15/4/2020 diff --git a/docs/reference/ds.scatterPlot.html b/docs/reference/ds.scatterPlot.html index a9017b4f..3bdf0eee 100644 --- a/docs/reference/ds.scatterPlot.html +++ b/docs/reference/ds.scatterPlot.html @@ -1,51 +1,45 @@ -Generates non-disclosive scatter plots — ds.scatterPlot • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function uses two disclosure control methods to generate non-disclosive scatter plots of two server-side continuous variables.

    -
    +
    +

    Usage

    ds.scatterPlot(
       x = NULL,
       y = NULL,
    @@ -58,8 +52,8 @@ 

    Generates non-disclosive scatter plots

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -109,13 +103,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.scatterPlot returns to the client-side one or more scatter plots depending on the argument type.

    -
    -

    Details

    +
    +

    Details

    As the generation of a scatter plot from original data is disclosive and is not permitted in DataSHIELD, this function allows the user to plot non-disclosive scatter plots.

    If the argument method is set to 'deterministic', the server-side function searches @@ -153,13 +147,13 @@

    Details

    study is generated.

    Server function called: scatterPlotDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki 
    @@ -214,23 +208,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.scatterPlot.md b/docs/reference/ds.scatterPlot.md new file mode 100644 index 00000000..26228ed5 --- /dev/null +++ b/docs/reference/ds.scatterPlot.md @@ -0,0 +1,179 @@ +# Generates non-disclosive scatter plots + +This function uses two disclosure control methods to generate +non-disclosive scatter plots of two server-side continuous variables. + +## Usage + +``` r +ds.scatterPlot( + x = NULL, + y = NULL, + method = "deterministic", + k = 3, + noise = 0.25, + type = "split", + return.coords = FALSE, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character string specifying the name of the explanatory variable, a + numeric vector. + +- y: + + a character string specifying the name of the response variable, a + numeric vector. + +- method: + + a character string that specifies the method that is used to generated + non-disclosive coordinates to be displayed in a scatter plot. This + argument can be set as `'deteministic'` or `'probabilistic'`. Default + `'deteministic'`. For more information see **Details**. + +- k: + + the number of the nearest neighbours for which their centroid is + calculated. Default 3. For more information see **Details**. + +- noise: + + the percentage of the initial variance that is used as the variance of + the embedded noise if the argument `method` is set to + `'probabilistic'`. For more information see **Details**. + +- type: + + a character that represents the type of graph to display. This can be + set as `'combine'` or `'split'`. Default `'split'`. For more + information see **Details**. + +- return.coords: + + a logical. If TRUE the coordinates of the anonymised data points are + return to the Console. Default value is FALSE. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.scatterPlot` returns to the client-side one or more scatter plots +depending on the argument `type`. + +## Details + +As the generation of a scatter plot from original data is disclosive and +is not permitted in DataSHIELD, this function allows the user to plot +non-disclosive scatter plots. + +If the argument `method` is set to `'deterministic'`, the server-side +function searches for the `k-1` nearest neighbours of each single data +point and calculates the centroid of such `k` points. The proximity is +defined by the minimum Euclidean distances of z-score transformed data. + +When the coordinates of all centroids are estimated the function applies +scaling to expand the centroids back to the dispersion of the original +data. The scaling is achieved by multiplying the centroids with a +scaling factor that is equal to the ratio between the standard deviation +of the original variable and the standard deviation of the calculated +centroids. The coordinates of the scaled centroids are then returned to +the client-side. + +The value of `k` is specified by the user. The suggested and default +value is equal to 3 which is also the suggested minimum threshold that +is used to prevent disclosure which is specified in the protection +filter `nfilter.kNN`. When the value of `k` increases, the disclosure +risk decreases but the utility loss increases. The value of `k` is used +only if the argument `method` is set to `'deterministic'`. Any value of +`k` is ignored if the argument `method` is set to `'probabilistic'`. + +If the argument `method` is set to `'probabilistic'`, the server-side +function generates a random normal noise of zero mean and variance equal +to 10% of the variance of each `x` and `y` variable. The noise is added +to each `x` and `y` variable and the disturbed by the addition of +`noise` data are returned to the client-side. Note that the seed random +number generator is fixed to a specific number generated from the data +and therefore the user gets the same figure every time that chooses the +probabilistic method in a given set of variables. The value of `noise` +is used only if the argument `method` is set to `'probabilistic'`. Any +value of `noise` is ignored if the argument `method` is set to +`'deterministic'`. + +In `type` argument can be set two graphics to display: +(1) If `type = 'combine'` a scatter plot for combined data is +generated. +(2) If `type = 'split'` one scatter plot for each study is generated. + +Server function called: `scatterPlotDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Example 1: generate a scatter plot for each study separately + #Using the default deterministic method and k = 10 + + ds.scatterPlot(x = "D$PM_BMI_CONTINUOUS", + y = "D$LAB_GLUC_ADJUSTED", + method = "deterministic", + k = 10, + type = "split", + datasources = connections) + + #Example 2: generate a combined scatter plot with the probabilistic method + #and noise of variance 0.5% of the variable's variance, and display the coordinates + # of the anonymised data points to the Console + + ds.scatterPlot(x = "D$PM_BMI_CONTINUOUS", + y = "D$LAB_GLUC_ADJUSTED", + method = "probabilistic", + noise = 0.5, + type = "combine", + datasources = connections) + + #Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.seq.html b/docs/reference/ds.seq.html index f7a8ae1c..31ea29cf 100644 --- a/docs/reference/ds.seq.html +++ b/docs/reference/ds.seq.html @@ -1,51 +1,45 @@ -Generates a sequence in the server-side — ds.seq • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function generates a sequence for given parameters on the server-side.

    -
    +
    +

    Usage

    ds.seq(
       FROM.value.char = "1",
       BY.value.char = "1",
    @@ -57,8 +51,8 @@ 

    Generates a sequence in the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    FROM.value.char
    @@ -105,15 +99,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.seq returns to the server-side the generated sequence. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function is similar to a native R function seq(). It creates a flexible range of sequence vectors that can then be used to help manage and analyse data.

    @@ -145,13 +139,13 @@

    Details

    generates a sequence of length 1001.

    Server function called: seqDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki
    @@ -205,23 +199,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.seq.md b/docs/reference/ds.seq.md new file mode 100644 index 00000000..b61759d0 --- /dev/null +++ b/docs/reference/ds.seq.md @@ -0,0 +1,169 @@ +# Generates a sequence in the server-side + +This function generates a sequence for given parameters on the +server-side. + +## Usage + +``` r +ds.seq( + FROM.value.char = "1", + BY.value.char = "1", + TO.value.char = NULL, + LENGTH.OUT.value.char = NULL, + ALONG.WITH.name = NULL, + newobj = "newObj", + datasources = NULL +) +``` + +## Arguments + +- FROM.value.char: + + an integer or a number in character from specifying the starting value + for the sequence. Default `"1"`. + +- BY.value.char: + + an integer or a number in character from specifying the value to + increment each step in the sequence. Default `"1"`. + +- TO.value.char: + + an integer or a number in character from specifying the terminal value + for the sequence. Default NULL. For more information see **Details**. + +- LENGTH.OUT.value.char: + + an integer or a number in character from specifying the length of the + sequence at which point its extension should be stopped. Default NULL. + For more information see **Details**. + +- ALONG.WITH.name: + + a character string specifying the name of a standard vector to + generate a vector of the same length. For more information see + **Details**. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `seq.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.seq` returns to the server-side the generated sequence. Also, two +validity messages are returned to the client-side indicating whether the +new object has been created in each data source and if so whether it is +in a valid form. + +## Details + +This function is similar to a native R function +[`seq()`](https://rdrr.io/r/base/seq.html). It creates a flexible range +of sequence vectors that can then be used to help manage and analyse +data. + +**Note**: the combinations of arguments that are not allowed for the +function `seq` in native R are also prohibited in `ds.seq`. + +To be specific, `FROM.value.char` argument defines the start of the +sequence and `BY.value.char` defines how the sequence is incremented (or +decremented) at each step. But where the sequence stops can be defined +in three different ways: +(1) `TO.value.char` indicates the terminal value of the sequence. For +example, +`ds.seq(FROM.value.char = "3", BY.value.char = "2", TO.value.char = "7")` +creates the sequence `3,5,7` on the server-side. +(2) `LENGTH.OUT.value.char` indicates the length of the sequence. For +example, +`ds.seq(FROM.value.char = "3", BY.value.char = "2", LENGTH.OUT.value.char = "7")` +creates the sequence `3,5,7,9,11,13,15` on the server-side. +(3) `ALONG.WITH.name` specifies the name of a variable on the +server-side, such that the sequence in each study will be equal in +length to that variable. For example, +`ds.seq(FROM.value.char = "3", BY.value.char = "2", ALONG.WITH.name = "var.x")` +creates a sequence such that if `var.x` is of length 100 in study 1 the +sequence written to study 1 will be `3,5,7,...,197,199,201` and if +`var.x` is of length 4 in study 2, the sequence written to study 2 will +be `3,5,7,9`. +Only one of the three arguments: `TO.value.char`, +`LENGTH.OUT.value.char` and `ALONG.WITH.name` can be non-null in any one +call. + +In `LENGTH.OUT.value.char` argument if you specify a number with a +decimal point but in character form this result in a sequence +`length(integer) + 1`. For example, +`LENGTH.OUT.value.char = "1000.0001"` generates a sequence of length +1001. + +Server function called: `seqDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create 3 different sequences + + ds.seq(FROM.value.char = "1", + BY.value.char = "2", + TO.value.char = "7", + newobj = "new.seq1", + datasources = connections) + + + ds.seq(FROM.value.char = "4", + BY.value.char = "3", + LENGTH.OUT.value.char = "10", + newobj = "new.seq2", + datasources = connections) + + ds.seq(FROM.value.char = "2", + BY.value.char = "5", + ALONG.WITH.name = "D$GENDER", + newobj = "new.seq3", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.setDefaultOpals.html b/docs/reference/ds.setDefaultOpals.html index b37d6871..0437dfaf 100644 --- a/docs/reference/ds.setDefaultOpals.html +++ b/docs/reference/ds.setDefaultOpals.html @@ -1,59 +1,52 @@ -Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    creates a default set of Opal objects called 'default.opals

    -
    +
    +

    Usage

    ds.setDefaultOpals(opal.name)
    -
    -

    Value

    +
    +

    Value

    Copies a specified set of Opals (on the client-side server) and calls the copy 'default.opals'

    -
    -

    Details

    +
    +

    Details

    By default if there is only one set of opals that is available for analysis, all DataSHIELD client-side functions will use that full set of Opals unless the 'datasources=' argument has been set and specifies that @@ -80,28 +73,24 @@

    Details

    if no default could be identified, but that did not work in all versions of R and so has been removed.

    -
    -

    Author

    +
    +

    Author

    Burton, PR. 28/9/16

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.setDefaultOpals.md b/docs/reference/ds.setDefaultOpals.md new file mode 100644 index 00000000..64a73c08 --- /dev/null +++ b/docs/reference/ds.setDefaultOpals.md @@ -0,0 +1,51 @@ +# Creates a default set of Opal objects called 'default.opals' + +creates a default set of Opal objects called 'default.opals + +## Usage + +``` r +ds.setDefaultOpals(opal.name) +``` + +## Value + +Copies a specified set of Opals (on the client-side server) and calls +the copy 'default.opals' + +## Details + +By default if there is only one set of opals that is available for +analysis, all DataSHIELD client-side functions will use that full set of +Opals unless the 'datasources=' argument has been set and specifies that +a particular subset of those Opals should be used instead. The correct +identification of the full single set of opals is based on the +datashield.connections_find() function which is an internal DataSHIELD +function that is run at the start of nearly every client side function. +To illustrate, if the single set of Opals is called 'study.opals' and +consists of six opals numbered study.opals\[1\] to study.opals\[6\] then +all client-side functions will use data from all six of these +'study.opals' unless, say, datasources=study.opals\[c(2,5)\] is declared +and only data from the second and fifth studies will then be used. On +the other hand, if there is more than one set of Opals in the analytic +environment client-side functions will be unable to determine which set +to use. The function datashield.connections_find() has therefore been +written so that if one of the Opal sets is called 'default.opals' then +that set - i.e. 'default.opals' - will be selected by default by all +DataSHIELD client-side functions. If there is more than one set of Opals +in the analytic environment and NONE of these is called 'default.opals', +the function ds.setDefaultOpals() therefore copies one set of opals and +to name that copy 'default.opals'. This set will then be selected by +default by all client-side functions, unless it is deleted and an +alternative set of opals is copied and named 'default.opals'. Regardless +how many sets of opals exist and regardless whether any of them may be +called 'default.opals', the 'datasources=' argument overrides the +defaults and allows the user to base his/her analysis on any set of +opals and any subset of those opals. An earlier version of +'datashield.connections_find()' asked the user to specify which Opal to +choose if no default could be identified, but that did not work in all +versions of R and so has been removed. + +## Author + +Burton, PR. 28/9/16 diff --git a/docs/reference/ds.setSeed.html b/docs/reference/ds.setSeed.html index 86b102af..d692e956 100644 --- a/docs/reference/ds.setSeed.html +++ b/docs/reference/ds.setSeed.html @@ -1,54 +1,47 @@ -Server-side random number generation — ds.setSeed • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Primes the pseudorandom number generator in a data source

    -
    +
    +

    Usage

    ds.setSeed(seed.as.integer = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    seed.as.integer
    @@ -62,8 +55,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    Sets the values of the vector of integers of length 626 known as .Random.seed on each data source that is the true current state of the random seed in each source. It also returns the value of the trigger @@ -71,8 +64,8 @@

    Value

    each source and also the integer vector of 626 elements that is .Random.seed itself.

    -
    -

    Details

    +
    +

    Details

    This function generates an instance of the full pseudorandom number seed that is a vector of integers of length 626 called .Random.seed, this vector is written to the server-side.

    @@ -98,13 +91,13 @@

    Details

    Server function called: setSeedDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki 
       
    @@ -148,23 +141,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.setSeed.md b/docs/reference/ds.setSeed.md new file mode 100644 index 00000000..2cf011f4 --- /dev/null +++ b/docs/reference/ds.setSeed.md @@ -0,0 +1,113 @@ +# Server-side random number generation + +Primes the pseudorandom number generator in a data source + +## Usage + +``` r +ds.setSeed(seed.as.integer = NULL, datasources = NULL) +``` + +## Arguments + +- seed.as.integer: + + a numeric value or a NULL that primes the random seed in each data + source. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +Sets the values of the vector of integers of length 626 known as +`.Random.seed` on each data source that is the true current state of the +random seed in each source. It also returns the value of the trigger +integer that has primed the random seed vector (`.Random.seed`) in each +source and also the integer vector of 626 elements that is +`.Random.seed itself`. + +## Details + +This function generates an instance of the full pseudorandom number seed +that is a vector of integers of length 626 called `.Random.seed`, this +vector is written to the server-side. + +This function is similar to a native R function +[`set.seed()`](https://rdrr.io/r/base/Random.html). + +In `seed.as.integer` argument the current limitation on the value of the +integer that can be specified is `-2147483647` up to `+2147483647` (this +is `+/- ([2^31]-1)`). + +Because you only specify one integer in the call to `ds.setSeed` (i.e. +the value for the `seed.as.integer` argument) that value will be used as +the priming trigger value in all of the specified data sources and so +the pseudorandom number generators will all start from the same position +and if a vector of pseudorandom number values is requested based on one +of DataSHIELD's pseudorandom number generating functions precisely the +same random vector will be generated in each source. If you want to +avoid this you can specify a different priming value in each source by +using the `datasources` argument to generate the random number vectors +one source at a time with a different integer in each case. + +Furthermore, if you use any one of DataSHIELD's pseudorandom number +generating functions: `ds.rNorm`, `ds.rUnif`, `ds.rPois` or `ds.rBinom`. +The function call itself automatically uses the single integer priming +seed you specify to generate different integers in each source. + +Server function called: `setSeedDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Generate a pseudorandom number in the server-side + + ds.setSeed(seed.as.integer = 152584, + datasources = connections) + + #Specify the pseudorandom number only in the first source + + ds.setSeed(seed.as.integer = 741, + datasources = connections[1])#only the frist study is used (study1) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } +``` diff --git a/docs/reference/ds.skewness.html b/docs/reference/ds.skewness.html index 01818e3a..9fef32c9 100644 --- a/docs/reference/ds.skewness.html +++ b/docs/reference/ds.skewness.html @@ -1,56 +1,56 @@ -Calculates the skewness of a server-side numeric variable — ds.skewness • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function calculates the skewness of a numeric variable that is stored on the server-side (Opal server).

    -
    -
    ds.skewness(x = NULL, method = 1, type = "both", datasources = NULL)
    +
    +

    Usage

    +
    ds.skewness(
    +  x = NULL,
    +  method = 1,
    +  type = "both",
    +  datasources = NULL,
    +  classConsistencyCheck = FALSE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -74,14 +74,19 @@

    Arguments

    objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default FALSE.

    +
    -
    -

    Value

    -

    ds.skewness returns a matrix showing the skewness of the input numeric variable, -the number of valid observations and the validity message.

    +
    +

    Value

    +

    ds.skewness returns a matrix showing the skewness of the input numeric variable +and the number of valid observations.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the function skewness in R package e1071.

    The function calculates the skewness of an input variable x with three different methods:
    @@ -100,13 +105,14 @@

    Details

    the calculation of the skewness.

    Server functions called: skewnessDS1 and skewnessDS2

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam, for DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -146,23 +152,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.skewness.md b/docs/reference/ds.skewness.md new file mode 100644 index 00000000..d740aa7d --- /dev/null +++ b/docs/reference/ds.skewness.md @@ -0,0 +1,131 @@ +# Calculates the skewness of a server-side numeric variable + +This function calculates the skewness of a numeric variable that is +stored on the server-side (Opal server). + +## Usage + +``` r +ds.skewness( + x = NULL, + method = 1, + type = "both", + datasources = NULL, + classConsistencyCheck = FALSE +) +``` + +## Arguments + +- x: + + a character string specifying the name of a numeric variable. + +- method: + + an integer value between 1 and 3 selecting one of the algorithms for + computing skewness. For more information see **Details**. The default + value is set to 1. + +- type: + + a character string which represents the type of analysis to carry out. + `type` can be set as: `'combine'`, `'split'` or `'both'`. For more + information see **Details**. The default value is set to `'both'`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default FALSE. + +## Value + +`ds.skewness` returns a matrix showing the skewness of the input numeric +variable and the number of valid observations. + +## Details + +This function is similar to the function `skewness` in R package +`e1071`. + +The function calculates the skewness of an input variable `x` with three +different methods: +(1) If `method` is set to 1 the following formula is used \\ skewness= +\frac{\sum\_{i=1}^{N} (x_i - \bar(x))^3 /N}{(\sum\_{i=1}^{N} ((x_i - +\bar(x))^2) /N)^(3/2) }\\, where \\ \bar{x} \\ is the mean of x and +\\N\\ is the number of observations. +(2) If `method` is set to 2 the following formula is used \\ skewness= +\frac{\sum\_{i=1}^{N} (x_i - \bar(x))^3 /N}{(\sum\_{i=1}^{N} ((x_i - +\bar(x))^2) /N)^(3/2) } \* \frac{\sqrt(N(N-1)}{n-2}\\. +(3) If `method` is set to 3 the following formula is used \\ skewness= +\frac{\sum\_{i=1}^{N} (x_i - \bar(x))^3 /N}{(\sum\_{i=1}^{N} ((x_i - +\bar(x))^2) /N)^(3/2) } \* (\frac{N-1}{N})^(3/2)\\. + +The `type` argument can be set as follows: +(1) If `type` is set to `'combine'`, `'combined'`, `'combines'` or +`'c'`, the global skewness is returned. +(2) If `type` is set to `'split'`, `'splits'` or `'s'`, the skewness is +returned separately for each study. +(3) If `type` is set to `'both'` or `'b'`, both sets of outputs are +produced. + +If `x` contains any missing value, the function removes those before the +calculation of the skewness. + +Server functions called: `skewnessDS1` and `skewnessDS2` + +## Author + +Demetris Avraam, for DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Calculate the skewness of LAB_TSC numeric variable for each study separately and combined + + ds.skewness(x = "D$LAB_TSC", + method = 1, + type = "both", + datasources = connections) + + # Clear the Datashield R sessions and logout + DSI::datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.sqrt.html b/docs/reference/ds.sqrt.html index 16679f1b..5ff31967 100644 --- a/docs/reference/ds.sqrt.html +++ b/docs/reference/ds.sqrt.html @@ -1,56 +1,50 @@ -Computes the square root values of a variable — ds.sqrt • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Computes the square root values for a specified numeric or integer vector. This function is similar to R function sqrt.

    -
    +
    +

    Usage

    ds.sqrt(x = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -68,27 +62,28 @@

    Arguments

    used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.sqrt assigns a vector for each study that includes the square root values of the input numeric or integer vector specified in the argument x. The created vectors are stored in the servers.

    -
    -

    Details

    +
    +

    Details

    The function calls the server-side function sqrtDS that computes the square root values of the elements of a numeric or integer vector and assigns a new vector with those square root values on the server-side. The name of the new generated vector is specified by the user through the argument newobj, otherwise is named by default to sqrt.newobj.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # Connecting to the Opal servers
    @@ -137,23 +132,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.sqrt.md b/docs/reference/ds.sqrt.md new file mode 100644 index 00000000..2fb5e3e5 --- /dev/null +++ b/docs/reference/ds.sqrt.md @@ -0,0 +1,100 @@ +# Computes the square root values of a variable + +Computes the square root values for a specified numeric or integer +vector. This function is similar to R function `sqrt`. + +## Usage + +``` r +ds.sqrt(x = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string providing the name of a numeric or an integer + vector. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default name is set to `sqrt.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.sqrt` assigns a vector for each study that includes the square root +values of the input numeric or integer vector specified in the argument +`x`. The created vectors are stored in the servers. + +## Details + +The function calls the server-side function `sqrtDS` that computes the +square root values of the elements of a numeric or integer vector and +assigns a new vector with those square root values on the server-side. +The name of the new generated vector is specified by the user through +the argument `newobj`, otherwise is named by default to `sqrt.newobj`. + +## Author + +Demetris Avraam for DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Example 1: Get the square root of LAB_HDL variable + ds.sqrt(x='D$LAB_HDL', newobj='LAB_HDL.sqrt', datasources=connections) + # compare the mean of LAB_HDL and of LAB_HDL.sqrt + # Note here that the number of missing values is bigger in the LAB_HDL.sqrt + ds.mean(x='D$LAB_HDL', datasources=connections) + ds.mean(x='LAB_HDL.sqrt', datasources=connections) + + # Example 2: Generate a repeated vector of the squares of integers from 1 to 10 + # and get their square roots + ds.make(toAssign='rep((1:10)^2, times=10)', newobj='squares.vector', datasources=connections) + ds.sqrt(x='squares.vector', newobj='sqrt.vector', datasources=connections) + ds.table(rvar='squares.vector')$output.list$TABLE_rvar.by.study_counts + ds.table(rvar='sqrt.vector')$output.list$TABLE_rvar.by.study_counts + + # clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.subset.html b/docs/reference/ds.subset.html index 9bcfb801..057a26e2 100644 --- a/docs/reference/ds.subset.html +++ b/docs/reference/ds.subset.html @@ -1,53 +1,48 @@ -Generates a valid subset of a table or a vector — ds.subset • dsBaseClientGenerates a valid subset of a table or a vector — ds.subset • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function uses the R classical subsetting with squared brackets '[]' and allows also to subset using a logical operator and a threshold. The object to subset from must be a vector (factor, numeric or character) or a table (data.frame or matrix).

    -
    +
    +

    Usage

    ds.subset(
       x = NULL,
       subset = "subsetObject",
    @@ -60,8 +55,8 @@ 

    Generates a valid subset of a table or a vector

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -100,12 +95,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    no data are return to the user, the generated subset dataframe is stored on the server side.

    -
    -

    Details

    +
    +

    Details

    (1) If the input data is a table the user specifies the rows and/or columns to include in the subset; the columns can be referred to by their names. Table subsetting can also be done using the name of a variable and a threshold (see example 3). (2) If the input data is a vector and the parameters 'rows', 'logical' and 'threshold' are all provided the last two are ignored @@ -113,18 +108,18 @@

    Details

    IMPORTANT NOTE: If the requested subset is not valid (i.e. contains less than the allowed number of observations) all the values are turned into missing values (NA). Hence an invalid subset is indicated by the fact that all values within it are set to NA.

    -
    -

    See also

    +
    +

    See also

    ds.subsetByClass to subset by the classes of factor vector(s).

    ds.meanByClass to compute mean and standard deviation across categories of a factor vectors.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # load the login data
    @@ -172,23 +167,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.subset.md b/docs/reference/ds.subset.md new file mode 100644 index 00000000..65c2254e --- /dev/null +++ b/docs/reference/ds.subset.md @@ -0,0 +1,146 @@ +# Generates a valid subset of a table or a vector + +The function uses the R classical subsetting with squared brackets +'\[\]' and allows also to subset using a logical operator and a +threshold. The object to subset from must be a vector (factor, numeric +or character) or a table (data.frame or matrix). + +## Usage + +``` r +ds.subset( + x = NULL, + subset = "subsetObject", + completeCases = FALSE, + rows = NULL, + cols = NULL, + logicalOperator = NULL, + threshold = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character, the name of the dataframe or the factor vector and the + range of the subset. + +- subset: + + the name of the output object, a list that holds the subset object. If + set to NULL the default name of this list is 'subsetObject' + +- completeCases: + + a character that tells if only complete cases should be included or + not. + +- rows: + + a vector of integers, the indices of the rows to extract. + +- cols: + + a vector of integers or a vector of characters; the indices of the + columns to extract or their names. + +- logicalOperator: + + a boolean, the logical parameter to use if the user wishes to subset a + vector using a logical operator. This parameter is ignored if the + input data is not a vector. + +- threshold: + + a numeric, the threshold to use in conjunction with the logical + parameter. This parameter is ignored if the input data is not a + vector. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +no data are return to the user, the generated subset dataframe is stored +on the server side. + +## Details + +\(1\) If the input data is a table the user specifies the rows and/or +columns to include in the subset; the columns can be referred to by +their names. Table subsetting can also be done using the name of a +variable and a threshold (see example 3). (2) If the input data is a +vector and the parameters 'rows', 'logical' and 'threshold' are all +provided the last two are ignored (i.e. 'rows' has precedence over the +other two parameters then). IMPORTANT NOTE: If the requested subset is +not valid (i.e. contains less than the allowed number of observations) +all the values are turned into missing values (NA). Hence an invalid +subset is indicated by the fact that all values within it are set to NA. + +## See also + +[ds.subsetByClass](ds.subsetByClass.md) to subset by the classes of +factor vector(s). + +[ds.meanByClass](ds.meanByClass.md) to compute mean and standard +deviation across categories of a factor vectors. + +## Author + +Gaye, A. + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # load the login data + data(logindata) + + # login and assign some variables to R + myvar <- list("DIS_DIAB","PM_BMI_CONTINUOUS","LAB_HDL", "GENDER") + conns <- datashield.login(logins=logindata,assign=TRUE,variables=myvar) + + # Example 1: generate a subset of the assigned dataframe (by default the table is named 'D') + # with complete cases only + ds.subset(x='D', subset='subD1', completeCases=TRUE) + # display the dimensions of the initial table ('D') and those of the subset table ('subD1') + ds.dim('D') + ds.dim('subD1') + + # Example 2: generate a subset of the assigned table (by default the table is named 'D') + # with only the variables + # DIS_DIAB' and'PM_BMI_CONTINUOUS' specified by their name. + ds.subset(x='D', subset='subD2', cols=c('DIS_DIAB','PM_BMI_CONTINUOUS')) + + # Example 3: generate a subset of the table D with bmi values greater than or equal to 25. + ds.subset(x='D', subset='subD3', logicalOperator='PM_BMI_CONTINUOUS>=', threshold=25) + + # Example 4: get the variable 'PM_BMI_CONTINUOUS' from the dataframe 'D' and generate a + # subset bmi + # vector with bmi values greater than or equal to 25 + ds.assign(toAssign='D$PM_BMI_CONTINUOUS', newobj='BMI') + ds.subset(x='BMI', subset='BMI25plus', logicalOperator='>=', threshold=25) + + # Example 5: subsetting by rows: + # get the logarithmic values of the variable 'lab_hdl' and generate a subset with + # the first 50 observations of that new vector. If the specified number of row is + # greater than the total + # number of rows in any of the studies the process will stop. + ds.assign(toAssign='log(D$LAB_HDL)', newobj='logHDL') + ds.subset(x='logHDL', subset='subLAB_HDL', rows=c(1:50)) + # now get a subset of the table 'D' with just the 100 first observations + ds.subset(x='D', subset='subD5', rows=c(1:100)) + + # clear the Datashield R sessions and logout + datashield.logout(conns) + +} # } +``` diff --git a/docs/reference/ds.subsetByClass.html b/docs/reference/ds.subsetByClass.html index 8ac9d4a7..19aef2f8 100644 --- a/docs/reference/ds.subsetByClass.html +++ b/docs/reference/ds.subsetByClass.html @@ -1,51 +1,45 @@ -Generates valid subset(s) of a data frame or a factor — ds.subsetByClass • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function takes a categorical variable or a data frame as input and generates subset(s) variables or data frames for each category.

    -
    +
    +

    Usage

    ds.subsetByClass(
       x = NULL,
       subsets = "subClasses",
    @@ -54,8 +48,8 @@ 

    Generates valid subset(s) of a data frame or a factor

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -76,30 +70,31 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    a no data are return to the user but messages are printed out.

    -
    -

    Details

    +
    +

    Details

    If the input data object is a data frame it is possible to specify the variables to subset on. If a subset is not 'valid' all its the values are reported as missing (i.e. NA), the name of the subsets is labelled with the suffix '_INVALID'. Subsets are considered invalid if the number of observations it holds are between 1 and the threshold allowed by the data owner. if a subset is empty (i.e. no entries) the name of the subset is labelled with the suffix '_EMPTY'.

    -
    -

    See also

    +
    +

    See also

    ds.meanByClass to compute mean and standard deviation across categories of a factor vectors.

    ds.subset to subset by complete cases (i.e. removing missing values), threshold, columns and rows.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # load the login data
    @@ -134,23 +129,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.subsetByClass.md b/docs/reference/ds.subsetByClass.md new file mode 100644 index 00000000..ca3ba958 --- /dev/null +++ b/docs/reference/ds.subsetByClass.md @@ -0,0 +1,104 @@ +# Generates valid subset(s) of a data frame or a factor + +The function takes a categorical variable or a data frame as input and +generates subset(s) variables or data frames for each category. + +## Usage + +``` r +ds.subsetByClass( + x = NULL, + subsets = "subClasses", + variables = NULL, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character, the name of the dataframe or the vector to generate + subsets from. + +- subsets: + + the name of the output object, a list that holds the subset objects. + If set to NULL the default name of this list is 'subClasses'. + +- variables: + + a vector of string characters, the name(s) of the variables to subset + by. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +a no data are return to the user but messages are printed out. + +## Details + +If the input data object is a data frame it is possible to specify the +variables to subset on. If a subset is not 'valid' all its the values +are reported as missing (i.e. NA), the name of the subsets is labelled +with the suffix '\_INVALID'. Subsets are considered invalid if the +number of observations it holds are between 1 and the threshold allowed +by the data owner. if a subset is empty (i.e. no entries) the name of +the subset is labelled with the suffix '\_EMPTY'. + +## See also + +[ds.meanByClass](ds.meanByClass.md) to compute mean and standard +deviation across categories of a factor vectors. + +[ds.subset](ds.subset.md) to subset by complete cases (i.e. removing +missing values), threshold, columns and rows. + +## Author + +Gaye, A. + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # load the login data + data(logindata) + + # login and assign some variables to R + myvar <- list('DIS_DIAB','PM_BMI_CONTINUOUS','LAB_HDL', 'GENDER') + conns <- datashield.login(logins=logindata,assign=TRUE,variables=myvar) + + # Example 1: generate all possible subsets from the table assigned above (one subset table + # for each class in each factor) + ds.subsetByClass(x='D', subsets='subclasses') + # display the names of the subset tables that were generated in each study + ds.names('subclasses') + + # Example 2: subset the table initially assigned by the variable 'GENDER' + ds.subsetByClass(x='D', subsets='subtables', variables='GENDER') + # display the names of the subset tables that were generated in each study + ds.names('subtables') + + # Example 3: generate a new variable 'gender' and split it into two vectors: males + # and females + ds.assign(toAssign='D$GENDER', newobj='gender') + ds.subsetByClass(x='gender', subsets='subvectors') + # display the names of the subset vectors that were generated in each study + ds.names('subvectors') + + # clear the Datashield R sessions and logout + datashield.logout(conns) + +} # } +``` diff --git a/docs/reference/ds.summary.html b/docs/reference/ds.summary.html index 886a3681..32d61ef7 100644 --- a/docs/reference/ds.summary.html +++ b/docs/reference/ds.summary.html @@ -1,54 +1,47 @@ -Generates the summary of a server-side object — ds.summary • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Generates the summary of a server-side object.

    -
    +
    +

    Usage

    ds.summary(x = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -61,8 +54,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.summary returns to the client-side the class and size of the server-side object. Also other information is returned depending on the class of the object. @@ -70,8 +63,8 @@

    Value

    such as the minimum and maximum values of numeric vectors are not returned. The summary is given for each study separately.

    -
    -

    Details

    +
    +

    Details

    This function provides some insight about an object. Unlike the similar native R summary function only a limited class of objects can be used as input to reduce the risk of disclosure. @@ -79,13 +72,14 @@

    Details

    are not given to the client because they are potentially disclosive.

    server functions called: isValidDS, dimDS and colnamesDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       ## Version 6, for version 5 see the Wiki 
    @@ -131,23 +125,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.summary.md b/docs/reference/ds.summary.md new file mode 100644 index 00000000..ab8ea5e9 --- /dev/null +++ b/docs/reference/ds.summary.md @@ -0,0 +1,95 @@ +# Generates the summary of a server-side object + +Generates the summary of a server-side object. + +## Usage + +``` r +ds.summary(x = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a character string specifying the name of a numeric or factor + variable. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.summary` returns to the client-side the class and size of the +server-side object. Also other information is returned depending on the +class of the object. For example, potentially disclosive information +such as the minimum and maximum values of numeric vectors are not +returned. The summary is given for each study separately. + +## Details + +This function provides some insight about an object. Unlike the similar +native R `summary` function only a limited class of objects can be used +as input to reduce the risk of disclosure. For example, the minimum and +the maximum values of a numeric vector are not given to the client +because they are potentially disclosive. + +server functions called: `isValidDS`, `dimDS` and `colnamesDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # Connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + # Log onto the remote Opal training servers + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Calculate the summary of a numeric variable + + ds.summary(x = "D$LAB_TSC", + datasources = connections) + + #Calculate the summary of a factor variable + + ds.summary(x = "D$PM_BMI_CATEGORICAL", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.table.html b/docs/reference/ds.table.html index c46ad065..7dac53f8 100644 --- a/docs/reference/ds.table.html +++ b/docs/reference/ds.table.html @@ -1,51 +1,45 @@ -Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Creates 1-dimensional, 2-dimensional and 3-dimensional tables using the table function in native R.

    -
    +
    +

    Usage

    ds.table(
       rvar = NULL,
       cvar = NULL,
    @@ -61,8 +55,8 @@ 

    Generates 1-, 2-, and 3-dimensional contingency tables with option of assign )

    -
    -

    Arguments

    +
    +

    Arguments

    rvar
    @@ -178,8 +172,8 @@

    Arguments

    see what then happens and check that it is behaving as anticipated/hoped.

    -
    -

    Value

    +
    +

    Value

    Having created the requested table based on serverside data it is returned to the clientside for the analyst to visualise (unless it is blocked because it fails the disclosure control criteria or @@ -193,8 +187,8 @@

    Value

    about the visible material passed to the clientside, and the optional table object written to the serverside can be seen under 'details' (above).

    -
    -

    Details

    +
    +

    Details

    The ds.table function selects numeric, integer or factor variables on the serverside which define a contingency table with up to three dimensions. The native R table function basically operates on @@ -271,28 +265,24 @@

    Details

    statistically important, the <suppress.chisq.warnings> argument can be set to TRUE to block the warnings. However, it is defaulted to FALSE.

    -
    -

    Author

    +
    +

    Author

    Paul Burton and Alex Westerberg for DataSHIELD Development Team, 01/05/2020

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.table.md b/docs/reference/ds.table.md new file mode 100644 index 00000000..b0bc7d22 --- /dev/null +++ b/docs/reference/ds.table.md @@ -0,0 +1,248 @@ +# Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics + +Creates 1-dimensional, 2-dimensional and 3-dimensional tables using the +`table` function in native R. + +## Usage + +``` r +ds.table( + rvar = NULL, + cvar = NULL, + stvar = NULL, + report.chisq.tests = FALSE, + exclude = NULL, + useNA = "always", + suppress.chisq.warnings = FALSE, + table.assign = FALSE, + newobj = NULL, + datasources = NULL, + force.nfilter = NULL +) +``` + +## Arguments + +- rvar: + + is a character string (in inverted commas) specifying the name of the + variable defining the rows in all of the 2 dimensional tables that + form the output. Please see 'details' above for more information about + one-dimensional tables when a variable name is provided by \ + but \ and \ are both NULL + +- cvar: + + is a character string specifying the name of the variable defining the + columns in all of the 2 dimensional tables that form the output. + +- stvar: + + is a character string specifying the name of the variable that indexes + the separate two dimensional tables in the output if the call + specifies a 3 dimensional table. + +- report.chisq.tests: + + if TRUE, chi-squared tests are applied to every 2 dimensional table in + the output and reported as "chisq.test_table.name". Default = FALSE. + +- exclude: + + this argument is passed through to the `table` function in native R + which is called by `tableDS`. The help for `table` in native R + indicates that 'exclude' specifies any levels that should be deleted + for all factors in rvar, cvar or stvar. If the \ argument + does not include NA and if the \ argument is not specified, it + implies \ = "always" in DataSHIELD. If you read the help for + `table` in native R including the 'details' and the 'examples' + (particularly 'd.patho') you will see that the response of `table` to + different combinations of the \ and \ arguments can + be non-intuitive. This is particularly so if there is more than one + type of missing (e.g. missing by observation as well as missing + because of an NaN response to a mathematical function - such as + log(-3.0)). In DataSHIELD, if you are in one of these complex settings + (which should not be very common) and you cannot interpret the output + that has been approached you might try: (1) making sure that the + variable producing the strange results is of class factor rather than + integer or numeric - although integers and numerics are coerced to + factors by `ds.table` they can occasionally behave less well when the + NA setting is complex; (2) specify both an \ argument e.g. + exclude = c("NaN","3") and a \ argument e.g. useNA= "no"; (3) + if you are excluding multiple levels e.g exclude = c("NA","3") then + you can reduce this to one e.g. exclude = c("NA") and then remove the + 3s by deleting rows of data, or converting the 3s to a different + value. + +- useNA: + + this argument is passed through to the `table` function in native R + which is called by `tableDS`. In DataSHIELD, this argument can take + two values: "no" or "always" which indicate whether to include NA + values in the table. For further information, please see the help for + the \ argument (above) and/or the help for the `table` + function in native R. Default value is set to "always". + +- suppress.chisq.warnings: + + if set to TRUE, the default warnings are suppressed that would + otherwise be produced by the `table` function in native R whenever an + expected cell count in one or more cells is less than 5. Default is + FALSE. Further details can be found under 'details' and the help + provided for the \ argument (above). + +- table.assign: + + is a Boolean argument set by default to FALSE. If it is FALSE the + `ds.table` function acts as a standard aggregate function - it returns + the table that is specified in its call to the clientside where it can + be visualised and worked with by the analyst. But if \ + is TRUE, the same table object is also written to the serverside. As + explained under 'details' (above), this may be useful when some + elements of a table need to be used to drive forward the overall + analysis (e.g. to help select individuals for an analysis sub-sample), + but the required table cannot be visualised or returned to the + clientside because it fails disclosure rules. + +- newobj: + + this a character string providing a name for the output table object + to be written to the serverside if \ is TRUE. If no + explicit name for the table object is specified, but \ + is nevertheless TRUE, the name for the serverside table object + defaults to `table.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + If the \ is to be specified, it should be set without + inverted commas: e.g. datasources=connections.em or + datasources=default.connections. If you wish to apply the function + solely to e.g. the second connection server in a set of three, the + argument can be specified as: e.g. datasources=connections.em\[2\]. If + you wish to specify the first and third connection servers in a set + you specify: e.g. datasources=connections.em\[c(1,3)\]. + +- force.nfilter: + + if \ is non-NULL it must be specified as a positive + integer represented as a character string: e.g. "173". This the has + the effect of the standard value of 'nfilter.tab' (often 1, 3, 5 or 10 + depending what value the data custodian has selected for this + particular data set), to this new value (here, 173). CRUCIALLY, the + `ds.table` function only allows the standard value to be INCREASED. So + if the standard value has been set as 5 (as one of the R options set + in the serverside connection), "6" and "4981" would be allowable + values for the \ argument but "4" or "1" would not. + The purpose of this argument is for the user or developer to force the + table to fail the disclosure control tests so the he/she can see what + then happens and check that it is behaving as anticipated/hoped. + +## Value + +Having created the requested table based on serverside data it is +returned to the clientside for the analyst to visualise (unless it is +blocked because it fails the disclosure control criteria or there is an +error for some other reason). + +The clientside output from `ds.table` includes error messages that +identify when the creation of a table from a particular study has failed +and why. If table.assign=TRUE, `ds.table` also writes the requested +table as an object named by the \ argument or set to 'newObj' +by default. + +Further information about the visible material passed to the clientside, +and the optional table object written to the serverside can be seen +under 'details' (above). + +## Details + +The `ds.table` function selects numeric, integer or factor variables on +the serverside which define a contingency table with up to three +dimensions. The native R `table` function basically operates on factors +and if variables are specified that are integers or numerics they are +first coerced to factors. If the 1-dimensional, 2-dimensional or +3-dimensional table generated from a given study satisfies appropriate +disclosure-control criteria it can be returned directly to the +clientside where it is presented as a study-specific table and is also +included in a combined table across all studies. + +The data custodian responsible for data security in a given study can +specify the minimum non-zero cell count that determines whether the +disclosure-control criterion can be viewed as having been met. If the +count in any one cell in a table falls below the specified threshold +(and is also non-zero) the whole table is blocked and cannot be returned +to the clientside. However, even if a table is potentially disclosive it +can still be written to the serverside while an empty representation of +the structure of the table is returned to the clientside. The contents +of the cells in the serverside table object are reflected in a vector of +counts which is one component of that table object. + +The true counts in the studyside vector are replaced by a sequential set +of cell-IDs running from 1:n (where n is the total number of cells in +the table) in the empty representation of the structure of the +potentially disclosive table that is returned to the clientside. These +cell-IDs reflect the order of the counts in the true counts vector on +the serverside. In consequence, if the number 13 appears in a cell of +the empty table returned to the clientside, it means that the true count +in that same cell is held as the 13th element of the true count vector +saved on the serverside. This means that a data analyst can still make +use of the counts from a call to the `ds.table` function to drive their +ongoing analysis even when one or more non-zero cell counts fall below +the specified threshold for potential disclosure risk. + +Because the table object on the serverside cannot be visualised or +transferred to the clientside, DataSHIELD ensures that although it can, +in this way, be used to advance analysis, it does not create a direct +risk of disclosure. + +The \ argument identifies the variable defining the rows in each +of the 2-dimensional tables produced in the output. + +The \ argument identifies the variable defining the columns in +the 2-dimensional tables produced in the output. + +In creating a 3-dimensional table the \ ('separate tables') +argument identifies the variable that indexes the set of two dimensional +tables in the output `ds.table`. + +As a minor technicality, it should be noted that if a 1-dimensional +table is required, one only need specify a value for the \ +argument and any one dimensional table in the output is presented as a +row vectors and so technically the \ variable defines the columns +in that 1 x n vector. However, the ds.table function deals with +1-dimensional tables differently to 2 and 3 dimensional tables and key +components of the output for one dimensional tables are actually two +dimensional: with rows defined by \ and with one column for each +of the studies. + +The output list generated by `ds.table` contains tables based on counts +named "table.name_counts" and other tables reporting corresponding +column proportions ("table.name_col.props") or row proportions +("table.name_row.props"). In one dimensional tables in the output the +output tables include \_counts and \_proportions. The latter are not +called \_col.props or \_row.props because, for the reasons noted above, +they are technically column proportions but are based on the +distribution of the \ variable. + +If the \ argument is set to TRUE, chisq tests are +applied to every 2-dimensional table in the output and reported as +"chisq.test_table.name". The \ argument defaults to +FALSE. + +If there is at least one expected cell counts \< 5 in an output table, +the native R \ function returns a warning. Because in a +DataSHIELD setting this often means that every study and several tables +may return the same warning and because it is debatable whether this +warning is really statistically important, the +\ argument can be set to TRUE to block the +warnings. However, it is defaulted to FALSE. + +## Author + +Paul Burton and Alex Westerberg for DataSHIELD Development Team, +01/05/2020 diff --git a/docs/reference/ds.table1D.html b/docs/reference/ds.table1D.html index d7199dfa..7908f983 100644 --- a/docs/reference/ds.table1D.html +++ b/docs/reference/ds.table1D.html @@ -1,53 +1,48 @@ -Generates 1-dimensional contingency tables — ds.table1D • dsBaseClientGenerates 1-dimensional contingency tables — ds.table1D • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function ds.table1D is a client-side wrapper function. It calls the server-side function table1DDS to generate 1-dimensional tables for all data sources.

    -
    +
    +

    Usage

    ds.table1D(
       x = NULL,
       type = "combine",
    @@ -56,8 +51,8 @@ 

    Generates 1-dimensional contingency tables

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -81,8 +76,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    A list object containing the following items:

    counts

    table(s) that hold counts for each level/category. If some cells counts are invalid (see 'Details' @@ -98,8 +93,8 @@

    Value

    studies they are originated from are also mentioned in the text message.

    -
    -

    Details

    +
    +

    Details

    The table returned by the server side function might be valid (non disclosive - no table cell have counts between 1 and the minimal number agreed by the data owner and set in the data repository) or invalid (potentially disclosive - one or more table cells have a count between 1 and the minimal number @@ -107,17 +102,17 @@

    Details

    count. This way it is possible the know the total count and combine total counts across data sources but it is not possible to identify the cell(s) that had the small counts which render the table invalid.

    -
    -

    See also

    +
    +

    See also

    ds.table2D for cross-tabulating two vectors.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.; Burton, P.

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # load the file that contains the login details
    @@ -152,23 +147,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.table1D.md b/docs/reference/ds.table1D.md new file mode 100644 index 00000000..cd4819e6 --- /dev/null +++ b/docs/reference/ds.table1D.md @@ -0,0 +1,125 @@ +# Generates 1-dimensional contingency tables + +The function ds.table1D is a client-side wrapper function. It calls the +server-side function table1DDS to generate 1-dimensional tables for all +data sources. + +## Usage + +``` r +ds.table1D( + x = NULL, + type = "combine", + warningMessage = TRUE, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character, the name of a numerical vector with discrete values - + usually a factor. + +- type: + + a character which represent the type of table to output: pooled table + or one table for each data source. If `type` is set to 'combine', a + pooled 1-dimensional table is returned; if If `type` is set to 'split' + a 1-dimensional table is returned for each data source. + +- warningMessage: + + a boolean, if set to TRUE (default) a warning is displayed if any + returned table is invalid. Warning messages are suppressed if this + parameter is set to FALSE. However the analyst can still view + 'validity' information which are stored in the output object + 'validity' - see the list of output objects. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +A list object containing the following items: + +- counts: + + table(s) that hold counts for each level/category. If some cells + counts are invalid (see 'Details' section) only the total (outer) cell + counts are displayed in the returned individual study tables or in the + pooled table. + +- percentages: + + table(s) that hold percentages for each level/category. Here also + inner cells are reported as missing if one or more cells are + 'invalid'. + +- validity: + + a text that informs the analyst about the validity of the output + tables. If any tables are invalid the studies they are originated from + are also mentioned in the text message. + +## Details + +The table returned by the server side function might be valid (non +disclosive - no table cell have counts between 1 and the minimal number +agreed by the data owner and set in the data repository) or invalid +(potentially disclosive - one or more table cells have a count between 1 +and the minimal number agreed by the data owner). If a 1-dimensional +table is invalid all the cells are set to NA except the total count. +This way it is possible the know the total count and combine total +counts across data sources but it is not possible to identify the +cell(s) that had the small counts which render the table invalid. + +## See also + +[ds.table2D](ds.table2D.md) for cross-tabulating two vectors. + +## Author + +Gaye, A.; Burton, P. + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # load the file that contains the login details + data(logindata) + + # login and assign all the stored variables to R + conns <- datashield.login(logins=logindata,assign=TRUE) + + # Example 1: generate a one dimensional table, outputting combined (pooled) contingency tables + output <- ds.table1D(x='D$GENDER') + output$counts + output$percentages + output$validity + + # Example 2: generate a one dimensional table, outputting study specific contingency tables + output <- ds.table1D(x='D$GENDER', type='split') + output$counts + output$percentages + output$validity + + # Example 3: generate a one dimensional table, outputting study specific and combined + # contingency tables - see what happens if the reruened table is 'invalid'. + output <- ds.table1D(x='D$DIS_CVA') + output$counts + output$percentages + output$validity + + # clear the Datashield R sessions and logout + datashield.logout(conns) + +} # } +``` diff --git a/docs/reference/ds.table2D.html b/docs/reference/ds.table2D.html index b2bfea29..16d94eb1 100644 --- a/docs/reference/ds.table2D.html +++ b/docs/reference/ds.table2D.html @@ -1,51 +1,45 @@ -Generates 2-dimensional contingency tables — ds.table2D • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    The function ds.table2D is a client-side wrapper function. It calls the server-side function 'table2DDS' that generates a 2-dimensional contingency table for each data source.

    -
    +
    +

    Usage

    ds.table2D(
       x = NULL,
       y = NULL,
    @@ -55,8 +49,8 @@ 

    Generates 2-dimensional contingency tables

    )
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -85,8 +79,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    A list object containing the following items:

    colPercent

    table(s) that hold column percentages for each level/category. Inner cells are reported as @@ -109,8 +103,8 @@

    Value

    studies they are originated from are also mentioned in the text message.

    -
    -

    Details

    +
    +

    Details

    The table returned by the server side function might be valid (non disclosive - no table cell have counts between 1 and the minimal number agreed by the data owner and set in the data repository as the "nfilter.tab") or invalid (potentially disclosive - one or more table cells have a count between 1 and the minimal number agreed @@ -118,36 +112,32 @@

    Details

    In this way, it is possible to combine total counts across all the data sources but it is not possible to identify the cell(s) that had the small counts which render the table invalid.

    -
    -

    See also

    +
    +

    See also

    ds.table1D for the tabulating one vector.

    -
    -

    Author

    +
    +

    Author

    Amadou Gaye, Paul Burton, Demetris Avraam, for DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.table2D.md b/docs/reference/ds.table2D.md new file mode 100644 index 00000000..2cbb5346 --- /dev/null +++ b/docs/reference/ds.table2D.md @@ -0,0 +1,108 @@ +# Generates 2-dimensional contingency tables + +The function ds.table2D is a client-side wrapper function. It calls the +server-side function 'table2DDS' that generates a 2-dimensional +contingency table for each data source. + +## Usage + +``` r +ds.table2D( + x = NULL, + y = NULL, + type = "both", + warningMessage = TRUE, + datasources = NULL +) +``` + +## Arguments + +- x: + + a character, the name of a numerical vector with discrete values - + usually a factor. + +- y: + + a character, the name of a numerical vector with discrete values - + usually a factor. + +- type: + + a character which represent the type of table to output: pooled table + or one table for each data source or both. If `type` is set to + 'combine', a pooled 2-dimensional table is returned; If `type` is set + to 'split' a 2-dimensional table is returned for each data source. If + `type` is set to 'both' (default) a pooled 2-dimensional table plus a + 2-dimensional table for each data source are returned. + +- warningMessage: + + a boolean, if set to TRUE (default) a warning is displayed if any + returned table is invalid. Warning messages are suppressed if this + parameter is set to FALSE. However the analyst can still view + 'validity' information which are stored in the output object + 'validity' - see the list of output objects. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +A list object containing the following items: + +- colPercent: + + table(s) that hold column percentages for each level/category. Inner + cells are reported as missing if one or more cells are 'invalid'. + +- rowPercent: + + table(s) that hold row percentages for each level/category. Inner + cells are reported as missing if one or more cells are 'invalid'. + +- chi2Test: + + Chi-squared test for homogeneity. + +- counts: + + table(s) that hold counts for each level/category. If some cell counts + are invalid (see 'Details' section) only the total (outer) cell counts + are displayed in the returned individual study tables or in the pooled + table. + +- validity: + + a text that informs the analyst about the validity of the output + tables. If any tables are invalid the studies they are originated from + are also mentioned in the text message. + +## Details + +The table returned by the server side function might be valid (non +disclosive - no table cell have counts between 1 and the minimal number +agreed by the data owner and set in the data repository as the +"nfilter.tab") or invalid (potentially disclosive - one or more table +cells have a count between 1 and the minimal number agreed by the data +owner). If a 2-dimensional table is invalid all the cells are set to NA +except the total counts. In this way, it is possible to combine total +counts across all the data sources but it is not possible to identify +the cell(s) that had the small counts which render the table invalid. + +## See also + +[ds.table1D](ds.table1D.md) for the tabulating one vector. + +## Author + +Amadou Gaye, Paul Burton, Demetris Avraam, for DataSHIELD Development +Team + +## Examples diff --git a/docs/reference/ds.tapply.assign.html b/docs/reference/ds.tapply.assign.html index d1ca8e8f..6dfe063a 100644 --- a/docs/reference/ds.tapply.assign.html +++ b/docs/reference/ds.tapply.assign.html @@ -1,53 +1,48 @@ -Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign • dsBaseClientApplies a Function Over a Ragged Array on the server-side — ds.tapply.assign • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Applies one of a selected range of functions to summarize an outcome variable over one or more indexing factors and write the resultant summary as an object on the server-side.

    -
    +
    +

    Usage

    ds.tapply.assign(
       X.name = NULL,
       INDEX.names = NULL,
    @@ -57,8 +52,8 @@ 

    Applies a Function Over a Ragged Array on the server-side

    )
    -
    -

    Arguments

    +
    +

    Arguments

    X.name
    @@ -90,14 +85,14 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.tapply.assign returns an array of the summarized values. The array is written to the server-side. It has the same number of dimensions as INDEX.

    -
    -

    Details

    +
    +

    Details

    This function applies one of a selected range of functions to each cell of a ragged array, that is to each (non-empty) @@ -148,13 +143,13 @@

    Details

    c(0.05,0.1,0.2,0.25,0.3,0.33,0.4,0.5,0.6,0.67,0.7,0.75,0.8,0.9,0.95)).

    Server function called: ds.tapply.assign

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -204,23 +199,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.tapply.assign.md b/docs/reference/ds.tapply.assign.md new file mode 100644 index 00000000..c889f702 --- /dev/null +++ b/docs/reference/ds.tapply.assign.md @@ -0,0 +1,173 @@ +# Applies a Function Over a Ragged Array on the server-side + +Applies one of a selected range of functions to summarize an outcome +variable over one or more indexing factors and write the resultant +summary as an object on the server-side. + +## Usage + +``` r +ds.tapply.assign( + X.name = NULL, + INDEX.names = NULL, + FUN.name = NULL, + newobj = NULL, + datasources = NULL +) +``` + +## Arguments + +- X.name: + + a character string specifying the name of the variable to be + summarized. + +- INDEX.names: + + a character string specifying the name of a single factor or a vector + of names of up to two factors to index the variable to be summarized. + For more information see **Details**. + +- FUN.name: + + a character string specifying the name of one of the allowable + summarizing functions. This can be set as: `"N"` (or `"length"`), + `"mean"`,`"sd"`, `"sum"`, or `"quantile"`. For more information see + **Details**. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `tapply.assign.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.tapply.assign` returns an array of the summarized values. The array +is written to the server-side. It has the same number of dimensions as +INDEX. + +## Details + +This function applies one of a selected range of functions to each cell +of a ragged array, that is to each (non-empty) group of values given by +each unique combination of a series of indexing factors. + +The range of allowable summarizing functions for DataSHIELD `ds.tapply` +function is much more restrictive than for the native R `tapply` +function. The reason for this is the protection against disclosure risk. + +Should other functions be required in the future then, provided they are +non-disclosive, the DataSHIELD development team could work on them if +requested. + +To protect against disclosure the number of observations in each +summarizing group in each source is calculated and if any of these falls +below the value of `nfilter.tab` (the minimum allowable non-zero count +in a contingency table) the tapply analysis of that source will return +only an error message. The value of `nfilter.tab` is can be set and +modified only by the data custodian. If an analytic team wishes the +value to be reduced (e.g. to 1 which will allow any output from tapply +to be returned) this needs to formally be discussed and agreed with the +data custodian. + +If the reason for the tapply analysis is, for example, to break a +dataset down into a small number of values for each individual and then +to flag up which individuals have got at least one positive value for a +binary outcome variable, then that flagging does not have to be overtly +returned to the client-side. Rather, it can be written as a vector to +the server-side at each source (which, like any other server-side +object, cannot then be seen, abstracted or copied). This can be done +using `ds.tapply.assign` which writes the results as a `newobj` to the +server-side and does not test the number of observations in each group +against `nfilter.tab`. For more information see the help option of +`ds.tapply.assign` function. + +The native R tapply function has optional arguments such as +`na.rm = TRUE` for `FUN = mean` which will exclude any NAs from the +outcome variable to be summarized. However, in order to keep +DataSHIELD's `ds.tapply` and `ds.tapply.assign` functions +straightforward, the server-side functions `tapplyDS` and +`tapplyDS.assign` both starts by stripping any observations which have +missing (NA) values in either the outcome variable or in any one of the +indexing factors. In consequence, the resultant analyses are always +based on complete cases. + +In `INDEX.names` argument the native R tapply function can coerce +non-factor vectors into factors. However, this does not always work when +using the DataSHIELD `ds.tapply` or `ds.tapply.assign` functions so if +you are concerned that an indexing vector is not being treated correctly +as a factor, please first declare it explicitly as a factor using +`ds.asFactor`. + +In `FUN.name` argument the allowable functions are: N or length (the +number of (non-missing) observations in the group defined by each +combination of indexing factors); mean; SD (standard deviation); sum; +quantile (with quantile probabilities set at +c(0.05,0.1,0.2,0.25,0.3,0.33,0.4,0.5,0.6,0.67,0.7,0.75,0.8,0.9,0.95)). + +Server function called: `ds.tapply.assign` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Apply a Function Over a Server-Side Ragged Array. + # Write the resultant object on the server-side + + + ds.assign(toAssign = "D$LAB_TSC", + newobj = "LAB_TSC", + datasources = connections) + + ds.assign(toAssign = "D$GENDER", + newobj = "GENDER", + datasources = connections) + + ds.tapply.assign(X.name = "LAB_TSC", + INDEX.names = c("GENDER"), + FUN.name = "mean", + newobj="fun_mean.newobj", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + } # } +``` diff --git a/docs/reference/ds.tapply.html b/docs/reference/ds.tapply.html index 39c9f854..8ddc96a9 100644 --- a/docs/reference/ds.tapply.html +++ b/docs/reference/ds.tapply.html @@ -1,53 +1,48 @@ -Applies a Function Over a Server-Side Ragged Array — ds.tapply • dsBaseClientApplies a Function Over a Server-Side Ragged Array — ds.tapply • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Apply one of a selected range of functions to summarize an outcome variable over one or more indexing factors. The resultant summary is written to the client-side.

    -
    +
    +

    Usage

    ds.tapply(
       X.name = NULL,
       INDEX.names = NULL,
    @@ -56,8 +51,8 @@ 

    Applies a Function Over a Server-Side Ragged Array

    )
    -
    -

    Arguments

    +
    +

    Arguments

    X.name
    @@ -84,13 +79,13 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.tapply returns to the client-side an array of the summarized values. It has the same number of dimensions as INDEX.

    -
    -

    Details

    +
    +

    Details

    This function is similar to a native R function tapply(). It applies one of a selected range of functions to each cell of a ragged array, that is to each (non-empty) @@ -141,13 +136,13 @@

    Details

    c(0.05,0.1,0.2,0.25,0.3,0.33,0.4,0.5,0.6,0.67,0.7,0.75,0.8,0.9,0.95)).

    Server function called: tapplyDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -195,23 +190,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.tapply.md b/docs/reference/ds.tapply.md new file mode 100644 index 00000000..1d8261c1 --- /dev/null +++ b/docs/reference/ds.tapply.md @@ -0,0 +1,166 @@ +# Applies a Function Over a Server-Side Ragged Array + +Apply one of a selected range of functions to summarize an outcome +variable over one or more indexing factors. The resultant summary is +written to the client-side. + +## Usage + +``` r +ds.tapply( + X.name = NULL, + INDEX.names = NULL, + FUN.name = NULL, + datasources = NULL +) +``` + +## Arguments + +- X.name: + + a character string specifying the name of the variable to be + summarized. + +- INDEX.names: + + a character string specifying the name of a single factor or a list or + vector of names of up to two factors to index the variable to be + summarized. For more information see **Details**. + +- FUN.name: + + a character string specifying the name of one of the allowable + summarizing functions. This can be set as: `"N"` (or `"length"`), + `"mean"`,`"sd"`, `"sum"`, or `"quantile"`. For more information see + **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.tapply` returns to the client-side an array of the summarized +values. It has the same number of dimensions as INDEX. + +## Details + +This function is similar to a native R function +[`tapply()`](https://rdrr.io/r/base/tapply.html). It applies one of a +selected range of functions to each cell of a ragged array, that is to +each (non-empty) group of values given by each unique combination of a +series of indexing factors. + +The range of allowable summarizing functions for DataSHIELD `ds.tapply` +function is much more restrictive than for the native R `tapply` +function. The reason for this is the protection against disclosure risk. + +Should other functions be required in the future then, provided they are +non-disclosive, the DataSHIELD development team could work on them if +requested. + +To protect against disclosure the number of observations in each +summarizing group in each source is calculated and if any of these falls +below the value of `nfilter.tab` (the minimum allowable non-zero count +in a contingency table) the tapply analysis of that source will return +only an error message. The value of `nfilter.tab` is can be set and +modified only by the data custodian. If an analytic team wishes the +value to be reduced (e.g. to 1 which will allow any output from tapply +to be returned) this needs to formally be discussed and agreed with the +data custodian. + +If the reason for the tapply analysis is, for example, to break a +dataset down into a small number of values for each individual and then +to flag up which individuals have got at least one positive value for a +binary outcome variable, then that flagging does not have to be overtly +returned to the client-side. Rather, it can be written as a vector to +the server-side at each source (which, like any other server-side +object, cannot then be seen, abstracted or copied). This can be done +using `ds.tapply.assign` which writes the results as a `newobj` to the +server-side and does not test the number of observations in each group +against `nfilter.tab`. For more information see the help option of +`ds.tapply.assign` function. + +The native R tapply function has optional arguments such as +`na.rm = TRUE` for `FUN = mean` which will exclude any NAs from the +outcome variable to be summarized. However, in order to keep +DataSHIELD's `ds.tapply` and `ds.tapply.assign` functions +straightforward, the server-side functions `tapplyDS` and +`tapplyDS.assign` both starts by stripping any observations which have +missing (NA) values in either the outcome variable or in any one of the +indexing factors. In consequence, the resultant analyses are always +based on complete cases. + +In `INDEX.names` argument the native R tapply function can coerce +non-factor vectors into factors. However, this does not always work when +using the DataSHIELD `ds.tapply` or `ds.tapply.assign` functions so if +you are concerned that an indexing vector is not being treated correctly +as a factor, please first declare it explicitly as a factor using +`ds.asFactor`. + +In `FUN.name` argument the allowable functions are: N or length (the +number of (non-missing) observations in the group defined by each +combination of indexing factors); mean; SD (standard deviation); sum; +quantile (with quantile probabilities set at +c(0.05,0.1,0.2,0.25,0.3,0.33,0.4,0.5,0.6,0.67,0.7,0.75,0.8,0.9,0.95)). + +Server function called: `tapplyDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Apply a Function Over a Server-Side Ragged Array + + ds.assign(toAssign = "D$LAB_TSC", + newobj = "LAB_TSC", + datasources = connections) + + ds.assign(toAssign = "D$GENDER", + newobj = "GENDER", + datasources = connections) + + ds.tapply(X.name = "LAB_TSC", + INDEX.names = c("GENDER"), + FUN.name = "mean", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.testObjExists.html b/docs/reference/ds.testObjExists.html index bc7e9edf..d636b8c3 100644 --- a/docs/reference/ds.testObjExists.html +++ b/docs/reference/ds.testObjExists.html @@ -1,56 +1,50 @@ -Checks if an R object exists on the server-side — ds.testObjExists • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This function checks that a specified data object exists or has been correctly created on a specified set of data servers.

    -
    +
    +

    Usage

    ds.testObjExists(test.obj.name = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    test.obj.name
    @@ -63,8 +57,8 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.testObjExists returns a list of messages specifying that the object exists on the server-side. If the specified object does not exist in at least one @@ -72,20 +66,20 @@

    Value

    class NULL, the function returns an error message specifying that the object does not exist in all data sources.

    -
    -

    Details

    +
    +

    Details

    Close copies of the code in this function are embedded into other functions that create an object and you then wish to test whether it has successfully been created e.g. ds.make or ds.asFactor.

    Server function called: testObjExistsDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -123,23 +117,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.testObjExists.md b/docs/reference/ds.testObjExists.md new file mode 100644 index 00000000..488fdd93 --- /dev/null +++ b/docs/reference/ds.testObjExists.md @@ -0,0 +1,84 @@ +# Checks if an R object exists on the server-side + +This function checks that a specified data object exists or has been +correctly created on a specified set of data servers. + +## Usage + +``` r +ds.testObjExists(test.obj.name = NULL, datasources = NULL) +``` + +## Arguments + +- test.obj.name: + + a character string specifying the name of the object to search. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.testObjExists` returns a list of messages specifying that the object +exists on the server-side. If the specified object does not exist in at +least one of the specified data sources or it exists but is of class +NULL, the function returns an error message specifying that the object +does not exist in all data sources. + +## Details + +Close copies of the code in this function are embedded into other +functions that create an object and you then wish to test whether it has +successfully been created e.g. `ds.make` or `ds.asFactor`. + +Server function called: `testObjExistsDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Check if D object exists on the server-side + + ds.testObjExists(test.obj.name = "D", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.unList.html b/docs/reference/ds.unList.html index dfb459fa..765e7baa 100644 --- a/docs/reference/ds.unList.html +++ b/docs/reference/ds.unList.html @@ -1,56 +1,50 @@ -Flattens Server-Side Lists — ds.unList • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Coerces an object of list class back to the class it was when it was coerced into a list.

    -
    +
    +

    Usage

    ds.unList(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -68,15 +62,15 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.unList returns to the server-side the unlist object. Also, two validity messages are returned to the client-side indicating whether the new object has been created in each data source and if so whether it is in a valid form.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the native R function unlist.

    When an object is coerced to a list, depending on the class of the original object some information may be lost. Thus, @@ -90,13 +84,13 @@

    Details

    the column names, etc.

    Server function called: unListDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       ## Version 6, for version 5 see the Wiki
       
    @@ -141,23 +135,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.unList.md b/docs/reference/ds.unList.md new file mode 100644 index 00000000..c83f3c8c --- /dev/null +++ b/docs/reference/ds.unList.md @@ -0,0 +1,104 @@ +# Flattens Server-Side Lists + +Coerces an object of list class back to the class it was when it was +coerced into a list. + +## Usage + +``` r +ds.unList(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string specifying the name of the input object to be + unlisted. + +- newobj: + + a character string that provides the name for the output variable that + is stored on the data servers. Default `unlist.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.unList` returns to the server-side the unlist object. Also, two +validity messages are returned to the client-side indicating whether the +new object has been created in each data source and if so whether it is +in a valid form. + +## Details + +This function is similar to the native R function `unlist`. + +When an object is coerced to a list, depending on the class of the +original object some information may be lost. Thus, for example, when a +data frame is coerced to list the information that underpins the +structure of the data frame is lost and when it is subject to the +function `ds.unList` it is returned to a simpler class than data frame +e.g. numeric (basically a numeric vector containing all of the original +data in all variables in the data frame but with no structure). If you +wish to reconstruct the original data frame you, therefore, need to +specify this structure again e.g. the column names, etc. + +Server function called: `unListDS` + +## Author + +DataSHIELD Development Team + +## Examples + +``` r +if (FALSE) { # \dontrun{ + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Create a list on the server-side + + ds.asList(x.name = "D", + newobj = "list.D", + datasources = connections) + + #Flatten a server-side lists + + ds.unList(x.name = "list.D", + newobj = "un.list.D", + datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) + +} # } +``` diff --git a/docs/reference/ds.unique.html b/docs/reference/ds.unique.html index 08d6ef9b..5253729c 100644 --- a/docs/reference/ds.unique.html +++ b/docs/reference/ds.unique.html @@ -1,54 +1,47 @@ -Perform 'unique' on a variable on the server-side — ds.unique • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Perform 'unique', from the 'base' package on a specified variable on the server-side

    -
    +
    +

    Usage

    ds.unique(x.name = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x.name
    @@ -66,22 +59,23 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    ds.unique returns the vector of unique R objects which are written to the server-side.

    -
    -

    Details

    +
    +

    Details

    Will create a vector or list which has no duplicate values.

    Server function called: uniqueDS

    -
    -

    Author

    +
    +

    Author

    Stuart Wheater, DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
       # connecting to the Opal servers
     
    @@ -114,23 +108,19 @@ 

    Examples

    } # }
    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.unique.md b/docs/reference/ds.unique.md new file mode 100644 index 00000000..54ccb65c --- /dev/null +++ b/docs/reference/ds.unique.md @@ -0,0 +1,82 @@ +# Perform 'unique' on a variable on the server-side + +Perform 'unique', from the 'base' package on a specified variable on the +server-side + +## Usage + +``` r +ds.unique(x.name = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x.name: + + a character string providing the name of the variable, in the server, + to perform `unique` upon + +- newobj: + + a character string that provides the name for the output object that + is stored on the data servers. Default `unique.newobj`. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +`ds.unique` returns the vector of unique R objects which are written to +the server-side. + +## Details + +Will create a vector or list which has no duplicate values. + +Server function called: `uniqueDS` + +## Author + +Stuart Wheater, DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + # Create a vector with combined objects + ds.unique(x.name = "D$LAB_TSC", newobj = "new.vect", datasources = connections) + + # Clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.var.html b/docs/reference/ds.var.html index 68691eb1..f9277228 100644 --- a/docs/reference/ds.var.html +++ b/docs/reference/ds.var.html @@ -1,54 +1,52 @@ -Computes server-side vector variance — ds.var • dsBaseClient - - -
    -
    +
    +
    +
    -
    - -
    +

    Computes the variance of a given server-side vector.

    -
    -
    ds.var(x = NULL, type = "split", checks = FALSE, datasources = NULL)
    +
    +

    Usage

    +
    ds.var(
    +  x = NULL,
    +  type = "split",
    +  datasources = NULL,
    +  classConsistencyCheck = FALSE
    +)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -63,30 +61,28 @@

    Arguments

    For more information see Details.

    -
    checks
    -

    logical. If TRUE optional checks of model -components will be undertaken. Default is FALSE to save time. -It is suggested that checks -should only be undertaken once the function call has failed.

    - -
    datasources

    a list of DSConnection-class objects obtained after login. If the datasources argument is not specified the default set of connections will be used: see datashield.connections_default.

    + +
    classConsistencyCheck
    +

    logical. If TRUE, checks that the input object has the same +class across all studies. Default FALSE.

    +
    -
    -

    Value

    +
    +

    Value

    ds.var returns to the client-side a list including:

    Variance.by.Study: estimated variance, Nmissing (number of missing observations), Nvalid (number of valid observations) and Ntotal (sum of missing and valid observations) separately for each study (if type = split or type = both).
    Global.Variance: estimated variance, Nmissing, Nvalid and Ntotal -across all studies combined (if type = combine or type = both).
    Nstudies: number of studies being analysed.
    ValidityMessage: indicates if the analysis was possible.

    +across all studies combined (if type = combine or type = both).
    Nstudies: number of studies being analysed.

    -
    -

    Details

    +
    +

    Details

    This function is similar to the R function var.

    The function can carry out 3 types of analysis depending on the argument type:
    @@ -98,13 +94,14 @@

    Details

    both sets of outputs are produced.

    Server function called: varDS

    -
    -

    Author

    +
    +

    Author

    DataSHIELD Development Team

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -136,7 +133,6 @@ 

    Examples

    ds.var(x = "D$LAB_TSC", type = "split", - checks = FALSE, datasources = connections) # clear the Datashield R sessions and logout @@ -145,23 +141,19 @@

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.var.md b/docs/reference/ds.var.md new file mode 100644 index 00000000..5faef808 --- /dev/null +++ b/docs/reference/ds.var.md @@ -0,0 +1,114 @@ +# Computes server-side vector variance + +Computes the variance of a given server-side vector. + +## Usage + +``` r +ds.var( + x = NULL, + type = "split", + datasources = NULL, + classConsistencyCheck = FALSE +) +``` + +## Arguments + +- x: + + a character specifying the name of a numerical vector. + +- type: + + a character string that represents the type of analysis to carry out. + This can be set as `'combine'`, `'combined'`, `'combines'`, `'split'`, + `'splits'`, `'s'`, `'both'` or `'b'`. For more information see + **Details**. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- classConsistencyCheck: + + logical. If TRUE, checks that the input object has the same class + across all studies. Default FALSE. + +## Value + +`ds.var` returns to the client-side a list including: + +`Variance.by.Study`: estimated variance, `Nmissing` (number of missing +observations), `Nvalid` (number of valid observations) and `Ntotal` (sum +of missing and valid observations) separately for each study (if +`type = split` or `type = both`). +`Global.Variance`: estimated variance, `Nmissing`, `Nvalid` and `Ntotal` +across all studies combined (if `type = combine` or `type = both`). +`Nstudies`: number of studies being analysed. + +## Details + +This function is similar to the R function `var`. + +The function can carry out 3 types of analysis depending on the argument +`type`: +(1) If `type` is set to `'combine'`, `'combined'`, `'combines'` or +`'c'`, a global variance is calculated. +(2) If `type` is set to `'split'`, `'splits'` or `'s'`, the variance is +calculated separately for each study. +(3) If `type` is set to `'both'` or `'b'`, both sets of outputs are +produced. + +Server function called: `varDS` + +## Author + +DataSHIELD Development Team + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + #Calculate the variance of a vector in the server-side + + ds.var(x = "D$LAB_TSC", + type = "split", + datasources = connections) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/reference/ds.vectorCalc.html b/docs/reference/ds.vectorCalc.html index 97fabde9..5d226778 100644 --- a/docs/reference/ds.vectorCalc.html +++ b/docs/reference/ds.vectorCalc.html @@ -1,56 +1,50 @@ -Performs a mathematical operation on two or more vectors — ds.vectorCalc • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Carries out a row-wise operation on two or more vector. The function calls no server side function; it uses the R operation symbols built in DataSHIELD.

    -
    +
    +

    Usage

    ds.vectorCalc(x = NULL, calc = NULL, newobj = NULL, datasources = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -71,12 +65,12 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    no data are returned to user, the output vector is stored on the server side.

    -
    -

    Details

    +
    +

    Details

    In DataSHIELD it is possible to perform an operation on vectors by just using the relevant R symbols (e.g. '+' for addition, '*' for multiplication, '-' for subtraction and '/' for division). This might however be inconvenient if the number of vectors to include in the operation is large. @@ -85,13 +79,13 @@

    Details

    at any one entry (i.e. observation), the operation returns a missing value ('NA') for that entry; the output vectors has, hence the same length as the input vectors.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
       # load the file that contains the login details
    @@ -112,23 +106,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/ds.vectorCalc.md b/docs/reference/ds.vectorCalc.md new file mode 100644 index 00000000..add44488 --- /dev/null +++ b/docs/reference/ds.vectorCalc.md @@ -0,0 +1,81 @@ +# Performs a mathematical operation on two or more vectors + +Carries out a row-wise operation on two or more vector. The function +calls no server side function; it uses the R operation symbols built in +DataSHIELD. + +## Usage + +``` r +ds.vectorCalc(x = NULL, calc = NULL, newobj = NULL, datasources = NULL) +``` + +## Arguments + +- x: + + a vector of characters, the names of the vectors to include in the + operation. + +- calc: + + a character, a symbol that indicates the mathematical operation to + carry out: '+' for addition, '/' for division, \*' for multiplication + and '-' for subtraction. + +- newobj: + + the name of the output object. By default the name is + 'vectorcalc.newobj'. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +no data are returned to user, the output vector is stored on the server +side. + +## Details + +In DataSHIELD it is possible to perform an operation on vectors by just +using the relevant R symbols (e.g. '+' for addition, '\*' for +multiplication, '-' for subtraction and '/' for division). This might +however be inconvenient if the number of vectors to include in the +operation is large. This function takes the names of two or more vectors +and performs the desired operation which could be an addition, a +multiplication, a subtraction or a division. If one or more vectors have +a missing value at any one entry (i.e. observation), the operation +returns a missing value ('NA') for that entry; the output vectors has, +hence the same length as the input vectors. + +## Author + +Gaye, A. + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + # load the file that contains the login details + data(logindata) + + # login and assign the required variables to R + myvar <- list('LAB_TSC','LAB_HDL') + conns <- datashield.login(logins=logindata,assign=TRUE,variables=myvar) + + # performs an addtion of 'LAB_TSC' and 'LAB_HDL' + myvectors <- c('D$LAB_TSC', 'D$LAB_HDL') + ds.vectorCalc(x=myvectors, calc='+') + + # clear the Datashield R sessions and logout + datashield.logout(conns) + +} # } +``` diff --git a/docs/reference/extract.html b/docs/reference/extract.html index fda0edae..1803038a 100644 --- a/docs/reference/extract.html +++ b/docs/reference/extract.html @@ -1,86 +1,75 @@ -Splits character by '$' and returns the single characters — extract • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    extract(input)
    -
    -

    Arguments

    +
    +

    Arguments

    input

    a vector or a list of characters

    -
    -

    Value

    +
    +

    Value

    a vector of characters

    -
    -

    Details

    +
    +

    Details

    Not required

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/extract.md b/docs/reference/extract.md new file mode 100644 index 00000000..e23ca595 --- /dev/null +++ b/docs/reference/extract.md @@ -0,0 +1,23 @@ +# Splits character by '\$' and returns the single characters + +This is an internal function. + +## Usage + +``` r +extract(input) +``` + +## Arguments + +- input: + + a vector or a list of characters + +## Value + +a vector of characters + +## Details + +Not required diff --git a/docs/reference/getPooledMean.html b/docs/reference/getPooledMean.html index 43036481..d9439b72 100644 --- a/docs/reference/getPooledMean.html +++ b/docs/reference/getPooledMean.html @@ -1,54 +1,47 @@ -Gets a pooled statistical mean — getPooledMean • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    getPooledMean(dtsources, x)
    -
    -

    Arguments

    +
    +

    Arguments

    dtsources
    @@ -60,34 +53,30 @@

    Arguments

    a character, the name of a numeric vector

    -
    -

    Value

    +
    +

    Value

    a pooled mean

    -
    -

    Details

    +
    +

    Details

    This function is called to avoid calling the client function 'ds.mean' which may stop the process due to some checks not required when computing a mean inside a function.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/getPooledMean.md b/docs/reference/getPooledMean.md new file mode 100644 index 00000000..d9e5f44b --- /dev/null +++ b/docs/reference/getPooledMean.md @@ -0,0 +1,33 @@ +# Gets a pooled statistical mean + +This is an internal function. + +## Usage + +``` r +getPooledMean(dtsources, x) +``` + +## Arguments + +- dtsources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- x: + + a character, the name of a numeric vector + +## Value + +a pooled mean + +## Details + +This function is called to avoid calling the client function 'ds.mean' +which may stop the process due to some checks not required when +computing a mean inside a function. diff --git a/docs/reference/getPooledVar.html b/docs/reference/getPooledVar.html index 091ac32a..e0285380 100644 --- a/docs/reference/getPooledVar.html +++ b/docs/reference/getPooledVar.html @@ -1,54 +1,47 @@ -Gets a pooled variance — getPooledVar • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    getPooledVar(dtsources, x)
    -
    -

    Arguments

    +
    +

    Arguments

    dtsources
    @@ -60,34 +53,30 @@

    Arguments

    a character, the name of a numeric vector

    -
    -

    Value

    +
    +

    Value

    a pooled variance

    -
    -

    Details

    +
    +

    Details

    This function is called to avoid calling the client function 'ds.var' which may stop the process due to some checks not required when computing a mean inside a function.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/getPooledVar.md b/docs/reference/getPooledVar.md new file mode 100644 index 00000000..2556c2b7 --- /dev/null +++ b/docs/reference/getPooledVar.md @@ -0,0 +1,33 @@ +# Gets a pooled variance + +This is an internal function. + +## Usage + +``` r +getPooledVar(dtsources, x) +``` + +## Arguments + +- dtsources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- x: + + a character, the name of a numeric vector + +## Value + +a pooled variance + +## Details + +This function is called to avoid calling the client function 'ds.var' +which may stop the process due to some checks not required when +computing a mean inside a function. diff --git a/docs/reference/glmChecks.html b/docs/reference/glmChecks.html index dc682998..68393dd5 100644 --- a/docs/reference/glmChecks.html +++ b/docs/reference/glmChecks.html @@ -1,56 +1,50 @@ -Checks if the elements in the glm model have the right characteristics — glmChecks • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function required by the client function ds.glm to verify all the variables and ensure the process does not halt inadvertently

    -
    +
    +

    Usage

    glmChecks(formula, data, offset, weights, datasources)
    -
    -

    Arguments

    +
    +

    Arguments

    formula
    @@ -77,38 +71,35 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    an integer 0 if check was passed and 1 if failed

    -
    -

    Details

    +
    +

    Details

    the variables are checked to ensure they are defined, not empty (i.e. are not missing at complete) and eventually (if 'offset' or 'weights') are of 'numeric' with non negative value (if 'weights').

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/glmChecks.md b/docs/reference/glmChecks.md new file mode 100644 index 00000000..27f04234 --- /dev/null +++ b/docs/reference/glmChecks.md @@ -0,0 +1,56 @@ +# Checks if the elements in the glm model have the right characteristics + +This is an internal function required by the client function `ds.glm` to +verify all the variables and ensure the process does not halt +inadvertently + +## Usage + +``` r +glmChecks(formula, data, offset, weights, datasources) +``` + +## Arguments + +- formula: + + a character, a regression formula given as a string character + +- data: + + a character, the name of an optional data frame containing the + variables in in the `formula`. + +- offset: + + null or a numeric vector that can be used to specify an a priori known + component to be included in the linear predictor during fitting. + +- weights: + + a character, the name of an optional vector of 'prior weights' to be + used in the fitting process. Should be NULL or a numeric vector. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +an integer 0 if check was passed and 1 if failed + +## Details + +the variables are checked to ensure they are defined, not empty (i.e. +are not missing at complete) and eventually (if 'offset' or 'weights') +are of 'numeric' with non negative value (if 'weights'). + +## Author + +Gaye, A. + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands diff --git a/docs/reference/index.html b/docs/reference/index.html index f315efd8..806123a5 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -1,548 +1,903 @@ -Package index • dsBaseClient - - -
    -
    -
    - +
    +
    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    All functions

    -

    -
    -

    ds.Boole()

    -

    Converts a server-side R object into Boolean indicators

    -

    ds.abs()

    -

    Computes the absolute values of a variable

    -

    ds.asCharacter()

    -

    Converts a server-side R object into a character class

    -

    ds.asDataMatrix()

    -

    Converts a server-side R object into a matrix

    -

    ds.asFactor()

    -

    Converts a server-side numeric vector into a factor

    -

    ds.asFactorSimple()

    -

    Converts a numeric vector into a factor

    -

    ds.asInteger()

    -

    Converts a server-side R object into an integer class

    -

    ds.asList()

    -

    Converts a server-side R object into a list

    -

    ds.asLogical()

    -

    Converts a server-side R object into a logical class

    -

    ds.asMatrix()

    -

    Converts a server-side R object into a matrix

    -

    ds.asNumeric()

    -

    Converts a server-side R object into a numeric class

    -

    ds.assign()

    -

    Assigns an R object to a name in the server-side

    -

    ds.auc()

    -

    Calculates the Area under the curve (AUC)

    -

    ds.boxPlot()

    -

    Draw boxplot

    -

    ds.boxPlotGG()

    -

    Renders boxplot

    -

    ds.boxPlotGG_data_Treatment()

    -

    Take a data frame on the server side an arrange it to pass it to the boxplot function

    -

    ds.boxPlotGG_data_Treatment_numeric()

    -

    Take a vector on the server side an arrange it to pass it to the boxplot function

    -

    ds.boxPlotGG_numeric()

    -

    Draw boxplot with information from a numeric vector

    -

    ds.boxPlotGG_table()

    -

    Draw boxplot with information from a data frame

    -

    ds.bp_standards()

    -

    Calculates Blood pressure z-scores

    -

    ds.c()

    -

    Combines values into a vector or list in the server-side

    -

    ds.cbind()

    -

    Combines R objects by columns in the server-side

    -

    ds.changeRefGroup()

    -

    Changes the reference level of a factor in the server-side

    -

    ds.class()

    -

    Class of the R object in the server-side

    -

    ds.colnames()

    -

    Produces column names of the R object in the server-side

    -

    ds.completeCases()

    -

    Identifies complete cases in server-side R objects

    -

    ds.contourPlot()

    -

    Generates a contour plot

    -

    ds.cor()

    -

    Calculates the correlation of R objects in the server-side

    -

    ds.corTest()

    -

    Tests for correlation between paired samples in the server-side

    -

    ds.cov()

    -

    Calculates the covariance of R objects in the server-side

    -

    ds.dataFrame()

    -

    Generates a data frame object in the server-side

    -

    ds.dataFrameFill()

    -

    Creates missing values columns in the server-side

    -

    ds.dataFrameSort()

    -

    Sorts data frames in the server-side

    -

    ds.dataFrameSubset()

    -

    Sub-sets data frames in the server-side

    -

    ds.densityGrid()

    -

    Generates a density grid in the client-side

    -

    ds.dim()

    -

    Retrieves the dimension of a server-side R object

    -

    ds.dmtC2S()

    -

    Copy a clientside data.frame, matrix or tibble to the serverside

    -

    ds.elspline()

    -

    Basis for a piecewise linear spline with meaningful coefficients

    -

    ds.exists()

    -

    Checks if an object is defined on the server-side

    -

    ds.exp()

    -

    Computes the exponentials in the server-side

    -

    ds.extractQuantiles()

    -

    Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies

    -

    ds.forestplot()

    -

    Forestplot for SLMA models

    -

    ds.gamlss()

    -

    Generalized Additive Models for Location Scale and Shape

    -

    ds.getWGSR()

    -

    Computes the WHO Growth Reference z-scores of anthropometric data

    -

    ds.glm()

    -

    Fits Generalized Linear Model

    -

    ds.glmPredict()

    -

    Applies predict.glm() to a serverside glm object

    -

    ds.glmSLMA()

    -

    Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA)

    -

    ds.glmSummary()

    -

    Summarize a glm object on the serverside

    -

    ds.glmerSLMA()

    -

    Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis

    -

    ds.heatmapPlot()

    -

    Generates a Heat Map plot

    -

    ds.hetcor()

    -

    Heterogeneous Correlation Matrix

    -

    ds.histogram()

    -

    Generates a histogram plot

    -

    ds.igb_standards()

    -

    Converts birth measurements to intergrowth z-scores/centiles

    -

    ds.isNA()

    -

    Checks if a server-side vector is empty

    -

    ds.isValid()

    -

    Checks if a server-side object is valid

    -

    ds.kurtosis()

    -

    Calculates the kurtosis of a numeric variable

    -

    ds.length()

    -

    Gets the length of an object in the server-side

    -

    ds.levels()

    -

    Produces levels attributes of a server-side factor

    -

    ds.lexis()

    -

    Represents follow-up in multiple states on multiple time scales

    -

    ds.list()

    -

    Constructs a list of objects in the server-side

    -

    ds.listClientsideFunctions()

    -

    Lists client-side functions

    -

    ds.listDisclosureSettings()

    -

    Lists disclosure settings

    -

    ds.listServersideFunctions()

    -

    Lists server-side functions

    -

    ds.lmerSLMA()

    -

    Fits Linear Mixed-Effect model via Study-Level Meta-Analysis

    -

    ds.log()

    -

    Computes logarithms in the server-side

    -

    ds.look()

    -

    Performs direct call to a server-side aggregate function

    -

    ds.ls()

    -

    lists all objects on a server-side environment

    -

    ds.lspline()

    -

    Basis for a piecewise linear spline with meaningful coefficients

    -

    ds.make()

    -

    Calculates a new object in the server-side

    -

    ds.matrix()

    -

    Creates a matrix on the server-side

    -

    ds.matrixDet()

    -

    Calculates de determinant of a matrix in the server-side

    -

    ds.matrixDet.report()

    -

    Returns matrix determinant to the client-side

    -

    ds.matrixDiag()

    -

    Calculates matrix diagonals in the server-side

    -

    ds.matrixDimnames()

    -

    Specifies the dimnames of the server-side matrix

    -

    ds.matrixInvert()

    -

    Inverts a server-side square matrix

    -

    ds.matrixMult()

    -

    Calculates tow matrix multiplication in the server-side

    -

    ds.matrixTranspose()

    -

    Transposes a server-side matrix

    -

    ds.mdPattern()

    -

    Display missing data patterns with disclosure control

    -

    ds.mean()

    -

    Computes server-side vector statistical mean

    -

    ds.meanByClass()

    -

    Computes the mean and standard deviation across categories

    -

    ds.meanSdGp()

    -

    Computes the mean and standard deviation across groups defined by one factor

    -

    ds.merge()

    -

    Merges two data frames in the server-side

    -

    ds.message()

    -

    Returns server-side messages to the client-side

    -

    ds.metadata()

    -

    Gets the metadata associated with a variable held on the server

    -

    ds.mice()

    -

    Multivariate Imputation by Chained Equations

    -

    ds.names()

    -

    Return the names of a list object

    -

    ds.ns()

    -

    Generate a Basis Matrix for Natural Cubic Splines

    -

    ds.numNA()

    -

    Gets the number of missing values in a server-side vector

    -

    ds.qlspline()

    -

    Basis for a piecewise linear spline with meaningful coefficients

    -

    ds.quantileMean()

    -

    Computes the quantiles of a server-side variable

    -

    ds.rBinom()

    -

    Generates Binomial distribution in the server-side

    -

    ds.rNorm()

    -

    Generates Normal distribution in the server-side

    -

    ds.rPois()

    -

    Generates Poisson distribution in the server-side

    -

    ds.rUnif()

    -

    Generates Uniform distribution in the server-side

    -

    ds.rbind()

    -

    Combines R objects by rows in the server-side

    -

    ds.reShape()

    -

    Reshapes server-side grouped data

    -

    ds.recodeLevels()

    -

    Recodes the levels of a server-side factor vector

    -

    ds.recodeValues()

    -

    Recodes server-side variable values

    -

    ds.rep()

    -

    Creates a repetitive sequence in the server-side

    -

    ds.replaceNA()

    -

    Replaces the missing values in a server-side vector

    -

    ds.rm()

    -

    Deletes server-side R objects

    -

    ds.rowColCalc()

    -

    Computes rows and columns sums and means in the server-side

    -

    ds.sample()

    -

    Performs random sampling and permuting of vectors, dataframes and matrices

    -

    ds.scatterPlot()

    -

    Generates non-disclosive scatter plots

    -

    ds.seq()

    -

    Generates a sequence in the server-side

    -

    ds.setSeed()

    -

    Server-side random number generation

    -

    ds.skewness()

    -

    Calculates the skewness of a server-side numeric variable

    -

    ds.sqrt()

    -

    Computes the square root values of a variable

    -

    ds.subset()

    -

    Generates a valid subset of a table or a vector

    -

    ds.subsetByClass()

    -

    Generates valid subset(s) of a data frame or a factor

    -

    ds.summary()

    -

    Generates the summary of a server-side object

    -

    ds.table()

    -

    Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics

    -

    ds.table1D()

    -

    Generates 1-dimensional contingency tables

    -

    ds.table2D()

    -

    Generates 2-dimensional contingency tables

    -

    ds.tapply()

    -

    Applies a Function Over a Server-Side Ragged Array

    -

    ds.tapply.assign()

    -

    Applies a Function Over a Ragged Array on the server-side

    -

    ds.testObjExists()

    -

    Checks if an R object exists on the server-side

    -

    ds.unList()

    -

    Flattens Server-Side Lists

    -

    ds.unique()

    -

    Perform 'unique' on a variable on the server-side

    -

    ds.var()

    -

    Computes server-side vector variance

    -

    ds.vectorCalc()

    -

    Performs a mathematical operation on two or more vectors

    - - -
    +
    +

    All functions

    -
    -
    -

    Site built with pkgdown 2.2.0.

    +
    + + + + +
    + + ds.Boole() + +
    +
    Converts a server-side R object into Boolean indicators
    + +
    + + ds.abs() + +
    +
    Computes the absolute values of a variable
    + +
    + + ds.asCharacter() + +
    +
    Converts a server-side R object into a character class
    + +
    + + ds.asDataMatrix() + +
    +
    Converts a server-side R object into a matrix
    + +
    + + ds.asFactor() + +
    +
    Converts a server-side numeric vector into a factor
    + +
    + + ds.asFactorSimple() + +
    +
    Converts a numeric vector into a factor
    + +
    + + ds.asInteger() + +
    +
    Converts a server-side R object into an integer class
    + +
    + + ds.asList() + +
    +
    Converts a server-side R object into a list
    + +
    + + ds.asLogical() + +
    +
    Converts a server-side R object into a logical class
    + +
    + + ds.asMatrix() + +
    +
    Converts a server-side R object into a matrix
    + +
    + + ds.asNumeric() + +
    +
    Converts a server-side R object into a numeric class
    + +
    + + ds.assign() + +
    +
    Assigns an R object to a name in the server-side
    + +
    + + ds.auc() + +
    +
    Calculates the Area under the curve (AUC)
    + +
    + + ds.boxPlot() + +
    +
    Draw boxplot
    + +
    + + ds.boxPlotGG() + +
    +
    Renders boxplot
    + +
    + + ds.boxPlotGG_data_Treatment() + +
    +
    Take a data frame on the server side an arrange it to pass it to the boxplot function
    + +
    + + ds.boxPlotGG_data_Treatment_numeric() + +
    +
    Take a vector on the server side an arrange it to pass it to the boxplot function
    + +
    + + ds.boxPlotGG_numeric() + +
    +
    Draw boxplot with information from a numeric vector
    + +
    + + ds.boxPlotGG_table() + +
    +
    Draw boxplot with information from a data frame
    + +
    + + ds.bp_standards() + +
    +
    Calculates Blood pressure z-scores
    + +
    + + ds.c() + +
    +
    Combines values into a vector or list in the server-side
    + +
    + + ds.cbind() + +
    +
    Combines R objects by columns in the server-side
    + +
    + + ds.changeRefGroup() + +
    +
    Changes the reference level of a factor in the server-side
    + +
    + + ds.class() + +
    +
    Class of the R object in the server-side
    + +
    + + ds.colnames() + +
    +
    Produces column names of the R object in the server-side
    + +
    + + ds.completeCases() + +
    +
    Identifies complete cases in server-side R objects
    + +
    + + ds.contourPlot() + +
    +
    Generates a contour plot
    + +
    + + ds.cor() + +
    +
    Calculates the correlation of R objects in the server-side
    + +
    + + ds.corTest() + +
    +
    Tests for correlation between paired samples in the server-side
    + +
    + + ds.cov() + +
    +
    Calculates the covariance of R objects in the server-side
    + +
    + + ds.dataFrame() + +
    +
    Generates a data frame object in the server-side
    + +
    + + ds.dataFrameFill() + +
    +
    Creates missing values columns in the server-side
    + +
    + + ds.dataFrameSort() + +
    +
    Sorts data frames in the server-side
    + +
    + + ds.dataFrameSubset() + +
    +
    Sub-sets data frames in the server-side
    + +
    + + ds.densityGrid() + +
    +
    Generates a density grid in the client-side
    + +
    + + ds.dim() + +
    +
    Retrieves the dimension of a server-side R object
    + +
    + + ds.dmtC2S() + +
    +
    Copy a clientside data.frame, matrix or tibble to the serverside
    + +
    + + ds.elspline() + +
    +
    Basis for a piecewise linear spline with meaningful coefficients
    + +
    + + ds.exists() + +
    +
    Checks if an object is defined on the server-side
    + +
    + + ds.exp() + +
    +
    Computes the exponentials in the server-side
    + +
    + + ds.extractQuantiles() + +
    +
    Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies
    + +
    + + ds.forestplot() + +
    +
    Forestplot for SLMA models
    + +
    + + ds.gamlss() + +
    +
    Generalized Additive Models for Location Scale and Shape
    + +
    + + ds.getWGSR() + +
    +
    Computes the WHO Growth Reference z-scores of anthropometric data
    + +
    + + ds.glm() + +
    +
    Fits Generalized Linear Model
    + +
    + + ds.glmPredict() + +
    +
    Applies predict.glm() to a serverside glm object
    + +
    + + ds.glmSLMA() + +
    +
    Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA)
    + +
    + + ds.glmSummary() + +
    +
    Summarize a glm object on the serverside
    + +
    + + ds.glmerSLMA() + +
    +
    Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis
    + +
    + + ds.heatmapPlot() + +
    +
    Generates a Heat Map plot
    + +
    + + ds.hetcor() + +
    +
    Heterogeneous Correlation Matrix
    + +
    + + ds.histogram() + +
    +
    Generates a histogram plot
    + +
    + + ds.igb_standards() + +
    +
    Converts birth measurements to intergrowth z-scores/centiles
    + +
    + + ds.isNA() + +
    +
    Checks if a server-side vector is empty
    + +
    + + ds.isValid() + +
    +
    Checks if a server-side object is valid
    + +
    + + ds.kurtosis() + +
    +
    Calculates the kurtosis of a numeric variable
    + +
    + + ds.length() + +
    +
    Gets the length of an object in the server-side
    + +
    + + ds.levels() + +
    +
    Produces levels attributes of a server-side factor
    + +
    + + ds.lexis() + +
    +
    Represents follow-up in multiple states on multiple time scales
    + +
    + + ds.list() + +
    +
    Constructs a list of objects in the server-side
    + +
    + + ds.listClientsideFunctions() + +
    +
    Lists client-side functions
    + +
    + + ds.listDisclosureSettings() + +
    +
    Lists disclosure settings
    + +
    + + ds.listServersideFunctions() + +
    +
    Lists server-side functions
    + +
    + + ds.lmerSLMA() + +
    +
    Fits Linear Mixed-Effect model via Study-Level Meta-Analysis
    + +
    + + ds.log() + +
    +
    Computes logarithms in the server-side
    + +
    + + ds.look() + +
    +
    Performs direct call to a server-side aggregate function
    + +
    + + ds.ls() + +
    +
    lists all objects on a server-side environment
    + +
    + + ds.lspline() + +
    +
    Basis for a piecewise linear spline with meaningful coefficients
    + +
    + + ds.make() + +
    +
    Calculates a new object in the server-side
    + +
    + + ds.matrix() + +
    +
    Creates a matrix on the server-side
    + +
    + + ds.matrixDet() + +
    +
    Calculates de determinant of a matrix in the server-side
    + +
    + + ds.matrixDet.report() + +
    +
    Returns matrix determinant to the client-side
    + +
    + + ds.matrixDiag() + +
    +
    Calculates matrix diagonals in the server-side
    + +
    + + ds.matrixDimnames() + +
    +
    Specifies the dimnames of the server-side matrix
    + +
    + + ds.matrixInvert() + +
    +
    Inverts a server-side square matrix
    + +
    + + ds.matrixMult() + +
    +
    Calculates tow matrix multiplication in the server-side
    + +
    + + ds.matrixTranspose() + +
    +
    Transposes a server-side matrix
    + +
    + + ds.mdPattern() + +
    +
    Display missing data patterns with disclosure control
    + +
    + + ds.mean() + +
    +
    Computes server-side vector statistical mean
    + +
    + + ds.meanByClass() + +
    +
    Computes the mean and standard deviation across categories
    + +
    + + ds.meanSdGp() + +
    +
    Computes the mean and standard deviation across groups defined by one factor
    + +
    + + ds.merge() + +
    +
    Merges two data frames in the server-side
    + +
    + + ds.message() + +
    +
    Returns server-side messages to the client-side
    + +
    + + ds.metadata() + +
    +
    Gets the metadata associated with a variable held on the server
    + +
    + + ds.mice() + +
    +
    Multivariate Imputation by Chained Equations
    + +
    + + ds.names() + +
    +
    Return the names of a list object
    + +
    + + ds.ns() + +
    +
    Generate a Basis Matrix for Natural Cubic Splines
    + +
    + + ds.numNA() + +
    +
    Gets the number of missing values in a server-side vector
    + +
    + + ds.qlspline() + +
    +
    Basis for a piecewise linear spline with meaningful coefficients
    + +
    + + ds.quantileMean() + +
    +
    Computes the quantiles of a server-side variable
    + +
    + + ds.rBinom() + +
    +
    Generates Binomial distribution in the server-side
    + +
    + + ds.rNorm() + +
    +
    Generates Normal distribution in the server-side
    + +
    + + ds.rPois() + +
    +
    Generates Poisson distribution in the server-side
    + +
    + + ds.rUnif() + +
    +
    Generates Uniform distribution in the server-side
    + +
    + + ds.rbind() + +
    +
    Combines R objects by rows in the server-side
    + +
    + + ds.reShape() + +
    +
    Reshapes server-side grouped data
    + +
    + + ds.recodeLevels() + +
    +
    Recodes the levels of a server-side factor vector
    + +
    + + ds.recodeValues() + +
    +
    Recodes server-side variable values
    + +
    + + ds.rep() + +
    +
    Creates a repetitive sequence in the server-side
    + +
    + + ds.replaceNA() + +
    +
    Replaces the missing values in a server-side vector
    + +
    + + ds.rm() + +
    +
    Deletes server-side R objects
    + +
    + + ds.rowColCalc() + +
    +
    Computes rows and columns sums and means in the server-side
    + +
    + + ds.sample() + +
    +
    Performs random sampling and permuting of vectors, dataframes and matrices
    + +
    + + ds.scatterPlot() + +
    +
    Generates non-disclosive scatter plots
    + +
    + + ds.seq() + +
    +
    Generates a sequence in the server-side
    + +
    + + ds.setSeed() + +
    +
    Server-side random number generation
    + +
    + + ds.skewness() + +
    +
    Calculates the skewness of a server-side numeric variable
    + +
    + + ds.sqrt() + +
    +
    Computes the square root values of a variable
    + +
    + + ds.subset() + +
    +
    Generates a valid subset of a table or a vector
    + +
    + + ds.subsetByClass() + +
    +
    Generates valid subset(s) of a data frame or a factor
    + +
    + + ds.summary() + +
    +
    Generates the summary of a server-side object
    + +
    + + ds.table() + +
    +
    Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics
    + +
    + + ds.table1D() + +
    +
    Generates 1-dimensional contingency tables
    + +
    + + ds.table2D() + +
    +
    Generates 2-dimensional contingency tables
    + +
    + + ds.tapply() + +
    +
    Applies a Function Over a Server-Side Ragged Array
    + +
    + + ds.tapply.assign() + +
    +
    Applies a Function Over a Ragged Array on the server-side
    + +
    + + ds.testObjExists() + +
    +
    Checks if an R object exists on the server-side
    + +
    + + ds.unList() + +
    +
    Flattens Server-Side Lists
    + +
    + + ds.unique() + +
    +
    Perform 'unique' on a variable on the server-side
    + +
    + + ds.var() + +
    +
    Computes server-side vector variance
    + +
    + + ds.vectorCalc() + +
    +
    Performs a mathematical operation on two or more vectors
    +
    +
    + + +
    -
    + +
    diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 00000000..efd02a73 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,226 @@ +# Package index + +## All functions + +- [`ds.Boole()`](ds.Boole.md) : Converts a server-side R object into + Boolean indicators +- [`ds.abs()`](ds.abs.md) : Computes the absolute values of a variable +- [`ds.asCharacter()`](ds.asCharacter.md) : Converts a server-side R + object into a character class +- [`ds.asDataMatrix()`](ds.asDataMatrix.md) : Converts a server-side R + object into a matrix +- [`ds.asFactor()`](ds.asFactor.md) : Converts a server-side numeric + vector into a factor +- [`ds.asFactorSimple()`](ds.asFactorSimple.md) : Converts a numeric + vector into a factor +- [`ds.asInteger()`](ds.asInteger.md) : Converts a server-side R object + into an integer class +- [`ds.asList()`](ds.asList.md) : Converts a server-side R object into a + list +- [`ds.asLogical()`](ds.asLogical.md) : Converts a server-side R object + into a logical class +- [`ds.asMatrix()`](ds.asMatrix.md) : Converts a server-side R object + into a matrix +- [`ds.asNumeric()`](ds.asNumeric.md) : Converts a server-side R object + into a numeric class +- [`ds.assign()`](ds.assign.md) : Assigns an R object to a name in the + server-side +- [`ds.auc()`](ds.auc.md) : Calculates the Area under the curve (AUC) +- [`ds.boxPlot()`](ds.boxPlot.md) : Draw boxplot +- [`ds.boxPlotGG()`](ds.boxPlotGG.md) : Renders boxplot +- [`ds.boxPlotGG_data_Treatment()`](ds.boxPlotGG_data_Treatment.md) : + Take a data frame on the server side an arrange it to pass it to the + boxplot function +- [`ds.boxPlotGG_data_Treatment_numeric()`](ds.boxPlotGG_data_Treatment_numeric.md) + : Take a vector on the server side an arrange it to pass it to the + boxplot function +- [`ds.boxPlotGG_numeric()`](ds.boxPlotGG_numeric.md) : Draw boxplot + with information from a numeric vector +- [`ds.boxPlotGG_table()`](ds.boxPlotGG_table.md) : Draw boxplot with + information from a data frame +- [`ds.bp_standards()`](ds.bp_standards.md) : Calculates Blood pressure + z-scores +- [`ds.c()`](ds.c.md) : Combines values into a vector or list in the + server-side +- [`ds.cbind()`](ds.cbind.md) : Combines R objects by columns in the + server-side +- [`ds.changeRefGroup()`](ds.changeRefGroup.md) : Changes the reference + level of a factor in the server-side +- [`ds.class()`](ds.class.md) : Class of the R object in the server-side +- [`ds.colnames()`](ds.colnames.md) : Produces column names of the R + object in the server-side +- [`ds.completeCases()`](ds.completeCases.md) : Identifies complete + cases in server-side R objects +- [`ds.contourPlot()`](ds.contourPlot.md) : Generates a contour plot +- [`ds.cor()`](ds.cor.md) : Calculates the correlation of R objects in + the server-side +- [`ds.corTest()`](ds.corTest.md) : Tests for correlation between paired + samples in the server-side +- [`ds.cov()`](ds.cov.md) : Calculates the covariance of R objects in + the server-side +- [`ds.dataFrame()`](ds.dataFrame.md) : Generates a data frame object in + the server-side +- [`ds.dataFrameFill()`](ds.dataFrameFill.md) : Creates missing values + columns in the server-side +- [`ds.dataFrameSort()`](ds.dataFrameSort.md) : Sorts data frames in the + server-side +- [`ds.dataFrameSubset()`](ds.dataFrameSubset.md) : Sub-sets data frames + in the server-side +- [`ds.densityGrid()`](ds.densityGrid.md) : Generates a density grid in + the client-side +- [`ds.dim()`](ds.dim.md) : Retrieves the dimension of a server-side R + object +- [`ds.dmtC2S()`](ds.dmtC2S.md) : Copy a clientside data.frame, matrix + or tibble to the serverside +- [`ds.elspline()`](ds.elspline.md) : Basis for a piecewise linear + spline with meaningful coefficients +- [`ds.exists()`](ds.exists.md) : Checks if an object is defined on the + server-side +- [`ds.exp()`](ds.exp.md) : Computes the exponentials in the server-side +- [`ds.extractQuantiles()`](ds.extractQuantiles.md) : Secure ranking of + a vector across all sources and use of these ranks to estimate global + quantiles across all studies +- [`ds.forestplot()`](ds.forestplot.md) : Forestplot for SLMA models +- [`ds.gamlss()`](ds.gamlss.md) : Generalized Additive Models for + Location Scale and Shape +- [`ds.getWGSR()`](ds.getWGSR.md) : Computes the WHO Growth Reference + z-scores of anthropometric data +- [`ds.glm()`](ds.glm.md) : Fits Generalized Linear Model +- [`ds.glmPredict()`](ds.glmPredict.md) : Applies predict.glm() to a + serverside glm object +- [`ds.glmSLMA()`](ds.glmSLMA.md) : Fit a Generalized Linear Model (GLM) + with pooling via Study Level Meta-Analysis (SLMA) +- [`ds.glmSummary()`](ds.glmSummary.md) : Summarize a glm object on the + serverside +- [`ds.glmerSLMA()`](ds.glmerSLMA.md) : Fits Generalized Linear + Mixed-Effect Models via Study-Level Meta-Analysis +- [`ds.heatmapPlot()`](ds.heatmapPlot.md) : Generates a Heat Map plot +- [`ds.hetcor()`](ds.hetcor.md) : Heterogeneous Correlation Matrix +- [`ds.histogram()`](ds.histogram.md) : Generates a histogram plot +- [`ds.igb_standards()`](ds.igb_standards.md) : Converts birth + measurements to intergrowth z-scores/centiles +- [`ds.isNA()`](ds.isNA.md) : Checks if a server-side vector is empty +- [`ds.isValid()`](ds.isValid.md) : Checks if a server-side object is + valid +- [`ds.kurtosis()`](ds.kurtosis.md) : Calculates the kurtosis of a + numeric variable +- [`ds.length()`](ds.length.md) : Gets the length of an object in the + server-side +- [`ds.levels()`](ds.levels.md) : Produces levels attributes of a + server-side factor +- [`ds.lexis()`](ds.lexis.md) : Represents follow-up in multiple states + on multiple time scales +- [`ds.list()`](ds.list.md) : Constructs a list of objects in the + server-side +- [`ds.listClientsideFunctions()`](ds.listClientsideFunctions.md) : + Lists client-side functions +- [`ds.listDisclosureSettings()`](ds.listDisclosureSettings.md) : Lists + disclosure settings +- [`ds.listServersideFunctions()`](ds.listServersideFunctions.md) : + Lists server-side functions +- [`ds.lmerSLMA()`](ds.lmerSLMA.md) : Fits Linear Mixed-Effect model via + Study-Level Meta-Analysis +- [`ds.log()`](ds.log.md) : Computes logarithms in the server-side +- [`ds.look()`](ds.look.md) : Performs direct call to a server-side + aggregate function +- [`ds.ls()`](ds.ls.md) : lists all objects on a server-side environment +- [`ds.lspline()`](ds.lspline.md) : Basis for a piecewise linear spline + with meaningful coefficients +- [`ds.make()`](ds.make.md) : Calculates a new object in the server-side +- [`ds.matrix()`](ds.matrix.md) : Creates a matrix on the server-side +- [`ds.matrixDet()`](ds.matrixDet.md) : Calculates de determinant of a + matrix in the server-side +- [`ds.matrixDet.report()`](ds.matrixDet.report.md) : Returns matrix + determinant to the client-side +- [`ds.matrixDiag()`](ds.matrixDiag.md) : Calculates matrix diagonals in + the server-side +- [`ds.matrixDimnames()`](ds.matrixDimnames.md) : Specifies the dimnames + of the server-side matrix +- [`ds.matrixInvert()`](ds.matrixInvert.md) : Inverts a server-side + square matrix +- [`ds.matrixMult()`](ds.matrixMult.md) : Calculates tow matrix + multiplication in the server-side +- [`ds.matrixTranspose()`](ds.matrixTranspose.md) : Transposes a + server-side matrix +- [`ds.mdPattern()`](ds.mdPattern.md) : Display missing data patterns + with disclosure control +- [`ds.mean()`](ds.mean.md) : Computes server-side vector statistical + mean +- [`ds.meanByClass()`](ds.meanByClass.md) : Computes the mean and + standard deviation across categories +- [`ds.meanSdGp()`](ds.meanSdGp.md) : Computes the mean and standard + deviation across groups defined by one factor +- [`ds.merge()`](ds.merge.md) : Merges two data frames in the + server-side +- [`ds.message()`](ds.message.md) : Returns server-side messages to the + client-side +- [`ds.metadata()`](ds.metadata.md) : Gets the metadata associated with + a variable held on the server +- [`ds.mice()`](ds.mice.md) : Multivariate Imputation by Chained + Equations +- [`ds.names()`](ds.names.md) : Return the names of a list object +- [`ds.ns()`](ds.ns.md) : Generate a Basis Matrix for Natural Cubic + Splines +- [`ds.numNA()`](ds.numNA.md) : Gets the number of missing values in a + server-side vector +- [`ds.qlspline()`](ds.qlspline.md) : Basis for a piecewise linear + spline with meaningful coefficients +- [`ds.quantileMean()`](ds.quantileMean.md) : Computes the quantiles of + a server-side variable +- [`ds.rBinom()`](ds.rBinom.md) : Generates Binomial distribution in the + server-side +- [`ds.rNorm()`](ds.rNorm.md) : Generates Normal distribution in the + server-side +- [`ds.rPois()`](ds.rPois.md) : Generates Poisson distribution in the + server-side +- [`ds.rUnif()`](ds.rUnif.md) : Generates Uniform distribution in the + server-side +- [`ds.rbind()`](ds.rbind.md) : Combines R objects by rows in the + server-side +- [`ds.reShape()`](ds.reShape.md) : Reshapes server-side grouped data +- [`ds.recodeLevels()`](ds.recodeLevels.md) : Recodes the levels of a + server-side factor vector +- [`ds.recodeValues()`](ds.recodeValues.md) : Recodes server-side + variable values +- [`ds.rep()`](ds.rep.md) : Creates a repetitive sequence in the + server-side +- [`ds.replaceNA()`](ds.replaceNA.md) : Replaces the missing values in a + server-side vector +- [`ds.rm()`](ds.rm.md) : Deletes server-side R objects +- [`ds.rowColCalc()`](ds.rowColCalc.md) : Computes rows and columns sums + and means in the server-side +- [`ds.sample()`](ds.sample.md) : Performs random sampling and permuting + of vectors, dataframes and matrices +- [`ds.scatterPlot()`](ds.scatterPlot.md) : Generates non-disclosive + scatter plots +- [`ds.seq()`](ds.seq.md) : Generates a sequence in the server-side +- [`ds.setSeed()`](ds.setSeed.md) : Server-side random number generation +- [`ds.skewness()`](ds.skewness.md) : Calculates the skewness of a + server-side numeric variable +- [`ds.sqrt()`](ds.sqrt.md) : Computes the square root values of a + variable +- [`ds.subset()`](ds.subset.md) : Generates a valid subset of a table or + a vector +- [`ds.subsetByClass()`](ds.subsetByClass.md) : Generates valid + subset(s) of a data frame or a factor +- [`ds.summary()`](ds.summary.md) : Generates the summary of a + server-side object +- [`ds.table()`](ds.table.md) : Generates 1-, 2-, and 3-dimensional + contingency tables with option of assigning to serverside only and + producing chi-squared statistics +- [`ds.table1D()`](ds.table1D.md) : Generates 1-dimensional contingency + tables +- [`ds.table2D()`](ds.table2D.md) : Generates 2-dimensional contingency + tables +- [`ds.tapply()`](ds.tapply.md) : Applies a Function Over a Server-Side + Ragged Array +- [`ds.tapply.assign()`](ds.tapply.assign.md) : Applies a Function Over + a Ragged Array on the server-side +- [`ds.testObjExists()`](ds.testObjExists.md) : Checks if an R object + exists on the server-side +- [`ds.unList()`](ds.unList.md) : Flattens Server-Side Lists +- [`ds.unique()`](ds.unique.md) : Perform 'unique' on a variable on the + server-side +- [`ds.var()`](ds.var.md) : Computes server-side vector variance +- [`ds.vectorCalc()`](ds.vectorCalc.md) : Performs a mathematical + operation on two or more vectors diff --git a/docs/reference/isAssigned.html b/docs/reference/isAssigned.html index 41addd07..c6a8cee3 100644 --- a/docs/reference/isAssigned.html +++ b/docs/reference/isAssigned.html @@ -1,54 +1,47 @@ -Checks an object has been generated on the server side — isAssigned • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    isAssigned(datasources = NULL, newobj = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    datasources
    @@ -60,35 +53,31 @@

    Arguments

    a character, the name the object to look for.

    -
    -

    Value

    +
    +

    Value

    nothing is return but the process is stopped if the object was not generated in any one server.

    -
    -

    Details

    +
    +

    Details

    After calling an assign function it is important to know whether or not the action has been completed by checking if the output actually exists on the server side.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/isAssigned.md b/docs/reference/isAssigned.md new file mode 100644 index 00000000..3583de49 --- /dev/null +++ b/docs/reference/isAssigned.md @@ -0,0 +1,34 @@ +# Checks an object has been generated on the server side + +This is an internal function. + +## Usage + +``` r +isAssigned(datasources = NULL, newobj = NULL) +``` + +## Arguments + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- newobj: + + a character, the name the object to look for. + +## Value + +nothing is return but the process is stopped if the object was not +generated in any one server. + +## Details + +After calling an assign function it is important to know whether or not +the action has been completed by checking if the output actually exists +on the server side. diff --git a/docs/reference/isDefined.html b/docs/reference/isDefined.html index ba4e5c44..091e7255 100644 --- a/docs/reference/isDefined.html +++ b/docs/reference/isDefined.html @@ -1,54 +1,47 @@ -Checks if the objects are defined in all studies — isDefined • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    isDefined(datasources = NULL, obj = NULL, error.message = TRUE)
    -
    -

    Arguments

    +
    +

    Arguments

    datasources
    @@ -67,39 +60,35 @@

    Arguments

    return a list of TRUE/FALSE indicating in which studies the object is defined

    -
    -

    Value

    +
    +

    Value

    returns an error message if error.message argument is set to TRUE (default) and if the input object is not defined in one or more studies, or a Boolean value if error.message argument is set to FALSE.

    -
    -

    Details

    +
    +

    Details

    In DataSHIELD an object included in analysis must be defined (i.e. exists) in all the studies. If not the process should halt.

    -
    -

    Author

    +
    +

    Author

    Demetris Avraam for DataSHIELD Development Team

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/isDefined.md b/docs/reference/isDefined.md new file mode 100644 index 00000000..90642b2e --- /dev/null +++ b/docs/reference/isDefined.md @@ -0,0 +1,45 @@ +# Checks if the objects are defined in all studies + +This is an internal function. + +## Usage + +``` r +isDefined(datasources = NULL, obj = NULL, error.message = TRUE) +``` + +## Arguments + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified, the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- obj: + + a character vector, the name of the object(s) to look for. + +- error.message: + + a Boolean which specifies if the function should stop and return an + error message when the input object is not defined in one or more + studies or to return a list of TRUE/FALSE indicating in which studies + the object is defined + +## Value + +returns an error message if `error.message` argument is set to TRUE +(default) and if the input object is not defined in one or more studies, +or a Boolean value if `error.message` argument is set to FALSE. + +## Details + +In DataSHIELD an object included in analysis must be defined (i.e. +exists) in all the studies. If not the process should halt. + +## Author + +Demetris Avraam for DataSHIELD Development Team diff --git a/docs/reference/logical2int.html b/docs/reference/logical2int.html index 670aee30..8c3825f1 100644 --- a/docs/reference/logical2int.html +++ b/docs/reference/logical2int.html @@ -1,88 +1,77 @@ -Turns a logical operator into an integer — logical2int • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    logical2int(obj = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    obj

    a character, the logical parameter to turn into an integer

    -
    -

    Value

    +
    +

    Value

    an integer

    -
    -

    Details

    +
    +

    Details

    This function is called to turn a logical operator given as a character into an integer: '>' is turned into 1, '>=' into 2, '<' into 3, '<=' into 4, '==' into 5 and '!=' into 6.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/logical2int.md b/docs/reference/logical2int.md new file mode 100644 index 00000000..bf2a716f --- /dev/null +++ b/docs/reference/logical2int.md @@ -0,0 +1,25 @@ +# Turns a logical operator into an integer + +This is an internal function. + +## Usage + +``` r +logical2int(obj = NULL) +``` + +## Arguments + +- obj: + + a character, the logical parameter to turn into an integer + +## Value + +an integer + +## Details + +This function is called to turn a logical operator given as a character +into an integer: '\>' is turned into 1, '\>=' into 2, '\<' into 3, '\<=' +into 4, '==' into 5 and '!=' into 6. diff --git a/docs/reference/meanByClassHelper0a.html b/docs/reference/meanByClassHelper0a.html index 8f51caa2..f42c4714 100644 --- a/docs/reference/meanByClassHelper0a.html +++ b/docs/reference/meanByClassHelper0a.html @@ -1,54 +1,47 @@ -Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    meanByClassHelper0a(a, b, type, datasources)
    -
    -

    Arguments

    +
    +

    Arguments

    a
    @@ -70,38 +63,34 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    a table or a list of tables that hold the length of the numeric variable and its mean and standard deviation in each subgroup (subset).

    -
    -

    Details

    +
    +

    Details

    This function is called by the function 'ds.meanByClass' to produce the final tables if the user specifies two loose vectors.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/meanByClassHelper0a.md b/docs/reference/meanByClassHelper0a.md new file mode 100644 index 00000000..b8d86db1 --- /dev/null +++ b/docs/reference/meanByClassHelper0a.md @@ -0,0 +1,48 @@ +# Computes the mean values of a numeric vector across a factor vector + +This is an internal function. + +## Usage + +``` r +meanByClassHelper0a(a, b, type, datasources) +``` + +## Arguments + +- a: + + a character, the name of a numeric vector. + +- b: + + a character, the name of a factor vector. + +- type: + + a character which represents the type of analysis to carry out. If + `type` is set to 'combine', a pooled table of results is generated. If + `type` is set to 'split', a table of results is generated for each + study. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +a table or a list of tables that hold the length of the numeric variable +and its mean and standard deviation in each subgroup (subset). + +## Details + +This function is called by the function 'ds.meanByClass' to produce the +final tables if the user specifies two loose vectors. + +## Author + +Gaye, A. diff --git a/docs/reference/meanByClassHelper0b.html b/docs/reference/meanByClassHelper0b.html index ec8d6dce..6712ebb6 100644 --- a/docs/reference/meanByClassHelper0b.html +++ b/docs/reference/meanByClassHelper0b.html @@ -1,54 +1,47 @@ -Runs the computation if variables are within a table structure — meanByClassHelper0b • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    meanByClassHelper0b(x, outvar, covar, type, datasources)
    -
    -

    Arguments

    +
    +

    Arguments

    x
    @@ -74,38 +67,35 @@

    Arguments

    the default set of connections will be used: see datashield.connections_default.

    -
    -

    Value

    +
    +

    Value

    a table or a list of tables that hold the length of the numeric variable(s) and their mean and standard deviation in each subgroup (subset).

    -
    -

    Details

    +
    +

    Details

    This function is called by the function 'ds.meanByClass' to produce the final tables if the user specify a table structure.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/meanByClassHelper0b.md b/docs/reference/meanByClassHelper0b.md new file mode 100644 index 00000000..e42c9602 --- /dev/null +++ b/docs/reference/meanByClassHelper0b.md @@ -0,0 +1,55 @@ +# Runs the computation if variables are within a table structure + +This is an internal function. + +## Usage + +``` r +meanByClassHelper0b(x, outvar, covar, type, datasources) +``` + +## Arguments + +- x: + + a character, the name of the dataset to get the subsets from. + +- outvar: + + a character vector, the names of the continuous variables + +- covar: + + a character vector, the names of up to 3 categorical variables + +- type: + + a character which represents the type of analysis to carry out. If + `type` is set to 'combine', a pooled table of results is generated. If + `type` is set to 'split', a table of results is generated for each + study. + +- datasources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +## Value + +a table or a list of tables that hold the length of the numeric +variable(s) and their mean and standard deviation in each subgroup +(subset). + +## Details + +This function is called by the function 'ds.meanByClass' to produce the +final tables if the user specify a table structure. + +## Author + +Gaye, A. + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands diff --git a/docs/reference/meanByClassHelper1.html b/docs/reference/meanByClassHelper1.html index 71330015..fbe05d4e 100644 --- a/docs/reference/meanByClassHelper1.html +++ b/docs/reference/meanByClassHelper1.html @@ -1,54 +1,47 @@ -Generates subset tables — meanByClassHelper1 • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    meanByClassHelper1(dtsource, tables, variable, categories)
    -
    -

    Arguments

    +
    +

    Arguments

    dtsource
    @@ -68,37 +61,33 @@

    Arguments

    a character vector, the classes in the variables to subset on

    -
    -

    Value

    +
    +

    Value

    a character the names of the new subset tables.

    -
    -

    Details

    +
    +

    Details

    This function is called by the function 'ds.meanByClass' to break down the initial table by the specified categorical variables.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/meanByClassHelper1.md b/docs/reference/meanByClassHelper1.md new file mode 100644 index 00000000..3920d301 --- /dev/null +++ b/docs/reference/meanByClassHelper1.md @@ -0,0 +1,44 @@ +# Generates subset tables + +This is an internal function. + +## Usage + +``` r +meanByClassHelper1(dtsource, tables, variable, categories) +``` + +## Arguments + +- dtsource: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- tables: + + a character vector, the tables to breakdown + +- variable: + + a character, the variable to subset on + +- categories: + + a character vector, the classes in the variables to subset on + +## Value + +a character the names of the new subset tables. + +## Details + +This function is called by the function 'ds.meanByClass' to break down +the initial table by the specified categorical variables. + +## Author + +Gaye, A. diff --git a/docs/reference/meanByClassHelper2.html b/docs/reference/meanByClassHelper2.html index 6ed19694..bf1eec21 100644 --- a/docs/reference/meanByClassHelper2.html +++ b/docs/reference/meanByClassHelper2.html @@ -1,54 +1,47 @@ -Generates a table for pooled results — meanByClassHelper2 • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    meanByClassHelper2(dtsources, tablenames, variables, invalidrecorder)
    -
    -

    Arguments

    +
    +

    Arguments

    dtsources
    @@ -68,38 +61,35 @@

    Arguments

    a list, holds information about invalid subsets in each study.

    -
    -

    Value

    +
    +

    Value

    a matrix, a table which contains the length, mean and standard deviation of each of the specified 'variables' in each subset table.

    -
    -

    Details

    +
    +

    Details

    This function is called by the function 'ds.meanByClass' to produce the final table if the user sets the parameter 'type' to combine (the default behaviour of 'ds.meanByClass').

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/meanByClassHelper2.md b/docs/reference/meanByClassHelper2.md new file mode 100644 index 00000000..b8674bd2 --- /dev/null +++ b/docs/reference/meanByClassHelper2.md @@ -0,0 +1,49 @@ +# Generates a table for pooled results + +This is an internal function. + +## Usage + +``` r +meanByClassHelper2(dtsources, tablenames, variables, invalidrecorder) +``` + +## Arguments + +- dtsources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- tablenames: + + a character vector, the name of the subset tables + +- variables: + + a character vector, the names of the continuous variables to computes + a mean for. + +- invalidrecorder: + + a list, holds information about invalid subsets in each study. + +## Value + +a matrix, a table which contains the length, mean and standard deviation +of each of the specified 'variables' in each subset table. + +## Details + +This function is called by the function 'ds.meanByClass' to produce the +final table if the user sets the parameter 'type' to combine (the +default behaviour of 'ds.meanByClass'). + +## Author + +Gaye, A. + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands diff --git a/docs/reference/meanByClassHelper3.html b/docs/reference/meanByClassHelper3.html index 2a925d93..3dc77075 100644 --- a/docs/reference/meanByClassHelper3.html +++ b/docs/reference/meanByClassHelper3.html @@ -1,54 +1,47 @@ -Generates results tables for each study separately — meanByClassHelper3 • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    meanByClassHelper3(dtsources, tablenames, variables, invalidrecorder)
    -
    -

    Arguments

    +
    +

    Arguments

    dtsources
    @@ -68,37 +61,34 @@

    Arguments

    a list, holds information about invalid subsets in each study

    -
    -

    Value

    +
    +

    Value

    a list which one results table for each study.

    -
    -

    Details

    +
    +

    Details

    This function is called by the function 'ds.meanByClass' to produce the final tables if the user sets the parameter 'type' to 'split'.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    +

    Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/meanByClassHelper3.md b/docs/reference/meanByClassHelper3.md new file mode 100644 index 00000000..62ff9975 --- /dev/null +++ b/docs/reference/meanByClassHelper3.md @@ -0,0 +1,47 @@ +# Generates results tables for each study separately + +This is an internal function. + +## Usage + +``` r +meanByClassHelper3(dtsources, tablenames, variables, invalidrecorder) +``` + +## Arguments + +- dtsources: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- tablenames: + + a character vector, the name of the subset tables + +- variables: + + a character vector, the names of the continuous variables to computes + a mean for. + +- invalidrecorder: + + a list, holds information about invalid subsets in each study + +## Value + +a list which one results table for each study. + +## Details + +This function is called by the function 'ds.meanByClass' to produce the +final tables if the user sets the parameter 'type' to 'split'. + +## Author + +Gaye, A. + +Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands diff --git a/docs/reference/meanByClassHelper4.html b/docs/reference/meanByClassHelper4.html index d9e0e16a..ebe3a5f4 100644 --- a/docs/reference/meanByClassHelper4.html +++ b/docs/reference/meanByClassHelper4.html @@ -1,49 +1,42 @@ -Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4 • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    This is an internal function.

    -
    +
    +

    Usage

    meanByClassHelper4(
       dtsource,
       alist,
    @@ -53,8 +46,8 @@ 

    Gets the subset tables out of the list (i.e. unlist)

    )
    -
    -

    Arguments

    +
    +

    Arguments

    dtsource
    @@ -78,37 +71,33 @@

    Arguments

    a character vector, the classes in the variables to subset on

    -
    -

    Value

    +
    +

    Value

    the 'loose' subset tables are stored on the server side

    -
    -

    Details

    +
    +

    Details

    This function is called by the function 'ds.meanByClass' to obtain 'loose' subset tables because the 'subsetByClass' function does not handle a table within a list.

    -
    -

    Author

    +
    +

    Author

    Gaye, A.

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/meanByClassHelper4.md b/docs/reference/meanByClassHelper4.md new file mode 100644 index 00000000..8031b7f0 --- /dev/null +++ b/docs/reference/meanByClassHelper4.md @@ -0,0 +1,55 @@ +# Gets the subset tables out of the list (i.e. unlist) + +This is an internal function. + +## Usage + +``` r +meanByClassHelper4( + dtsource, + alist, + initialtable, + variable = NA, + categories = NA +) +``` + +## Arguments + +- dtsource: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the \ the default set + of connections will be used: see + [datashield.connections_default](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- alist: + + the name of the list that holds the final subset tables + +- initialtable: + + a character the name of the table that the subset were generated from + +- variable: + + a character, the variable to subset on + +- categories: + + a character vector, the classes in the variables to subset on + +## Value + +the 'loose' subset tables are stored on the server side + +## Details + +This function is called by the function 'ds.meanByClass' to obtain +'loose' subset tables because the 'subsetByClass' function does not +handle a table within a list. + +## Author + +Gaye, A. diff --git a/docs/reference/rowPercent.html b/docs/reference/rowPercent.html index 1e7def70..b41684e1 100644 --- a/docs/reference/rowPercent.html +++ b/docs/reference/rowPercent.html @@ -1,90 +1,79 @@ -Produces row percentages — rowPercent • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    this is an INTERNAL function.

    -
    +
    +

    Usage

    rowPercent(dataframe)
    -
    -

    Arguments

    +
    +

    Arguments

    dataframe

    a data frame

    -
    -

    Value

    +
    +

    Value

    a data frame

    -
    -

    Details

    +
    +

    Details

    The function is required required by the client function ds.table2D.

    -
    -

    Author

    +
    +

    Author

    Gaye A

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/rowPercent.md b/docs/reference/rowPercent.md new file mode 100644 index 00000000..5ecaa7ae --- /dev/null +++ b/docs/reference/rowPercent.md @@ -0,0 +1,27 @@ +# Produces row percentages + +this is an INTERNAL function. + +## Usage + +``` r +rowPercent(dataframe) +``` + +## Arguments + +- dataframe: + + a data frame + +## Value + +a data frame + +## Details + +The function is required required by the client function `ds.table2D`. + +## Author + +Gaye A diff --git a/docs/reference/subsetHelper.html b/docs/reference/subsetHelper.html index 0e12af20..8325b865 100644 --- a/docs/reference/subsetHelper.html +++ b/docs/reference/subsetHelper.html @@ -1,54 +1,47 @@ -Ensures that the requested subset is not larger than the original object — subsetHelper • dsBaseClient - - -
    -
    -
    - +
    +
    +
    -
    +

    Compares subset and original object sizes and eventually carries out subsetting.

    -
    +
    +

    Usage

    subsetHelper(dts, data, rs = NULL, cs = NULL)
    -
    -

    Arguments

    +
    +

    Arguments

    dts
    @@ -70,21 +63,21 @@

    Arguments

    a vector of two integers or one or more characters.

    -
    -

    Value

    +
    +

    Value

    subsetHelper returns a message or the class of the object if the object has the same class in all studies.

    -
    -

    Details

    +
    +

    Details

    This function is called by the function ds.subset to ensure that the requested subset is not larger than the original object.

    This function is internal.

    Server function called: dimDS

    -
    -

    Examples

    +
    +

    Examples

    if (FALSE) { # \dontrun{
     
      ## Version 6, for version 5 see the Wiki
    @@ -123,23 +116,19 @@ 

    Examples

    -
    - -
    +
    -
    - +
    diff --git a/docs/reference/subsetHelper.md b/docs/reference/subsetHelper.md new file mode 100644 index 00000000..b3f5ff1a --- /dev/null +++ b/docs/reference/subsetHelper.md @@ -0,0 +1,88 @@ +# Ensures that the requested subset is not larger than the original object + +Compares subset and original object sizes and eventually carries out +subsetting. + +## Usage + +``` r +subsetHelper(dts, data, rs = NULL, cs = NULL) +``` + +## Arguments + +- dts: + + a list of + [`DSConnection-class`](https://datashield.github.io/DSI/reference/DSConnection-class.html) + objects obtained after login. If the `datasources` argument is not + specified the default set of connections will be used: see + [`datashield.connections_default`](https://datashield.github.io/DSI/reference/datashield.connections_default.html). + +- data: + + a character string specifying the name of the data frame or the factor + vector and the range of the subset. + +- rs: + + a vector of two integers specifying the indices of the rows de + extract. + +- cs: + + a vector of two integers or one or more characters. + +## Value + +`subsetHelper` returns a message or the class of the object if the +object has the same class in all studies. + +## Details + +This function is called by the function `ds.subset` to ensure that the +requested subset is not larger than the original object. + +This function is internal. + +Server function called: `dimDS` + +## Examples + +``` r +if (FALSE) { # \dontrun{ + + ## Version 6, for version 5 see the Wiki + + # connecting to the Opal servers + + require('DSI') + require('DSOpal') + require('dsBaseClient') + + builder <- DSI::newDSLoginBuilder() + builder$append(server = "study1", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM1", driver = "OpalDriver") + builder$append(server = "study2", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM2", driver = "OpalDriver") + builder$append(server = "study3", + url = "http://192.168.56.100:8080/", + user = "administrator", password = "datashield_test&", + table = "CNSIM.CNSIM3", driver = "OpalDriver") + logindata <- builder$build() + + connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = "D") + + subsetHelper(dts = connections, + data = "D", + rs = 1:10, + cs = c("D$LAB_TSC","D$LAB_TRIG")) + + # clear the Datashield R sessions and logout + datashield.logout(connections) +} # } +``` diff --git a/docs/search.json b/docs/search.json new file mode 100644 index 00000000..f9b2027e --- /dev/null +++ b/docs/search.json @@ -0,0 +1 @@ +[{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Paul Burton. Author. Rebecca Wilson. Author. Olly Butters. Author. Patricia Ryser-Welch. Author. Alex Westerberg. Author. Leire Abarrategui. Author. Roberto Villegas-Diaz. Author. Demetris Avraam. Author. Yannick Marcon. Author. Tom Bishop. Author. Amadou Gaye. Author. Xavier Escribà-Montagut. Author. Stuart Wheater. Author, maintainer. Tim Cadman. Author. Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg , Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye , Escribà-Montagut X, Wheater S, Cadman T (????). dsBaseClient: 'DataSHIELD' Client Side Base Functions. R package version 7.0.0.9000. Gaye , Marcon Y, Isaeva J, LaFlamme P, Turner , Jones E, Minion J, Boyd , Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir , Doiron D, Giepmans L, Wallace S, Budin-Ljøsne , Schmidt C, Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry , Peters , Phillips C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier , Harris J, Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014). “DataSHIELD: taking analysis data, data analysis.” International Journal Epidemiology, 43(6), 1929–1944. doi:10.1093/ije/dyu188. Wilson R, Butters O, Avraam D, Baker J, Tedds J, Turner , Murtagh M, Burton P (2017). “DataSHIELD – New Directions Dimensions.” Data Science Journal, 16(21), 1–21. doi:10.5334/dsj-2017-021. Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan , Murtagh M, Nestor M, Nybo Andersen , Parker S, Pinot de Moira , Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1–21. doi:10.1093/bioadv/vbaf046.","code":"@Manual{, title = {dsBaseClient: 'DataSHIELD' Client Side Base Functions}, author = {Paul Burton and Rebecca Wilson and Olly Butters and Patricia Ryser-Welch and Alex Westerberg and Leire Abarrategui and Roberto Villegas-Diaz and Demetris Avraam and Yannick Marcon and Tom Bishop and Amadou Gaye and Xavier Escribà-Montagut and Stuart Wheater and Tim Cadman}, note = {R package version 7.0.0.9000}, } @Article{, title = {{DataSHIELD: taking the analysis to the data, not the data to the analysis}}, author = {Amadou Gaye and Yannick Marcon and Julia Isaeva and Philippe {LaFlamme} and Andrew Turner and Elinor M Jones and Joel Minion and Andrew W Boyd and Christopher J Newby and Marja-Liisa Nuotio and Rebecca Wilson and Oliver Butters and Barnaby Murtagh and Ipek Demir and Dany Doiron and Lisette Giepmans and Susan E Wallace and Isabelle Budin-Lj{\\o}sne and Carsten O. Schmidt and Paolo Boffetta and Mathieu Boniol and Maria Bota and Kim W Carter and Nick {deKlerk} and Chris Dibben and Richard W Francis and Tero Hiekkalinna and Kristian Hveem and Kirsti Kval{\\o}y and Sean Millar and Ivan J Perry and Annette Peters and Catherine M Phillips and Frank Popham and Gillian Raab and Eva Reischl and Nuala Sheehan and Melanie Waldenberger and Markus Perola and Edwin {{van den Heuvel}} and John Macleod and Bartha M Knoppers and Ronald P Stolk and Isabel Fortier and Jennifer R Harris and Bruce H R Woffenbuttel and Madeleine J Murtagh and Vincent Ferretti and Paul R Burton}, journal = {International Journal of Epidemiology}, year = {2014}, volume = {43}, number = {6}, pages = {1929--1944}, doi = {10.1093/ije/dyu188}, } @Article{, title = {{DataSHIELD – New Directions and Dimensions}}, author = {Rebecca C. Wilson and Oliver W. Butters and Demetris Avraam and James Baker and Jonathan A. Tedds and Andrew Turner and Madeleine Murtagh and Paul R. Burton}, journal = {Data Science Journal}, year = {2017}, volume = {16}, number = {21}, pages = {1--21}, doi = {10.5334/dsj-2017-021}, } @Article{, title = {{DataSHIELD: mitigating disclosure risk in a multi-site federated analysis platform}}, author = {Demetris Avraam and Rebecca C Wilson and Noemi {{Aguirre Chan}} and Soumya Banerjee and Tom R P Bishop and Olly Butters and Tim Cadman and Luise Cederkvist and Liesbeth Duijts and Xavier {{Escrib{\\a`a} Montagut}} and Hugh Garner and Gon{\\c c}alo {Gon{\\c c}alves} and Juan R Gonz{\\a'a}lez and Sido Haakma and Mette Hartlev and Jan Hasenauer and Manuel Huth and Eleanor Hyde and Vincent W V Jaddoe and Yannick Marcon and Michaela Th Mayrhofer and Fruzsina Molnar-Gabor and Andrei Scott Morgan and Madeleine Murtagh and Marc Nestor and Anne-Marie {{Nybo Andersen}} and Simon Parker and Angela {{Pinot de Moira}} and Florian Schwarz and Katrine Strandberg-Larsen and Morris A Swertz and Marieke Welten and Stuart Wheater and Paul R Burton}, journal = {Bioinformatics Advances}, year = {2024}, volume = {5}, number = {1}, pages = {1--21}, doi = {10.1093/bioadv/vbaf046}, editor = {Thomas Lengauer}, publisher = {Oxford University Press (OUP)}, }"},{"path":[]},{"path":"/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"DataSHIELD Client Side Base Functions","text":"can install released version dsBaseClient CRAN : development version GitHub : full list development branches, checkout https://github.com/datashield/dsBaseClient/branches","code":"install.packages(\"dsBaseClient\") install.packages(\"remotes\") remotes::install_github(\"datashield/dsBaseClient\", \"\") # Install v7.0.0 with the following remotes::install_github(\"datashield/dsBaseClient\", \"7.0.0\")"},{"path":"/index.html","id":"about","dir":"","previous_headings":"","what":"About","title":"DataSHIELD Client Side Base Functions","text":"DataSHIELD software package allows non-disclosive federated analysis sensitive data. website (https://www.datashield.org) depth descriptions , works install . key point highlight DataSHIELD client-server infrastructure, dsBase package (https://github.com/datashield/dsBase) needs used conjunction dsBaseClient package (https://github.com/datashield/dsBaseClient) - trying use one without makes sense. Detailed instructions install DataSHIELD https://www.datashield.org/wiki. Discussion help using DataSHIELD can obtained DataSHIELD Forum https://datashield.discourse.group/ code organised :","code":""},{"path":"/index.html","id":"references","dir":"","previous_headings":"","what":"References","title":"DataSHIELD Client Side Base Functions","text":"[1] Burton P, Wilson R, Butters O, Ryser-Welch P, Westerberg , Abarrategui L, Villegas-Diaz R, Avraam D, Marcon Y, Bishop T, Gaye , Escribà Montagut X, Wheater S (2025). dsBaseClient: ‘DataSHIELD’ Client Side Base Functions. R package version 6.3.5. [2] Gaye , Marcon Y, Isaeva J, LaFlamme P, Turner , Jones E, Minion J, Boyd , Newby C, Nuotio M, Wilson R, Butters O, Murtagh B, Demir , Doiron D, Giepmans L, Wallace S, Budin-Ljøsne , Oliver Schmidt C, Boffetta P, Boniol M, Bota M, Carter K, deKlerk N, Dibben C, Francis R, Hiekkalinna T, Hveem K, Kvaløy K, Millar S, Perry , Peters , Phillips C, Popham F, Raab G, Reischl E, Sheehan N, Waldenberger M, Perola M, van den Heuvel E, Macleod J, Knoppers B, Stolk R, Fortier , Harris J, Woffenbuttel B, Murtagh M, Ferretti V, Burton P (2014). “DataSHIELD: taking analysis data, data analysis.” International Journal Epidemiology, 43(6), 1929-1944. https://doi.org/10.1093/ije/dyu188. [3] Wilson R, W. Butters O, Avraam D, Baker J, Tedds J, Turner , Murtagh M, R. Burton P (2017). “DataSHIELD – New Directions Dimensions.” Data Science Journal, 16(21), 1-21. https://doi.org/10.5334/dsj-2017-021. [4] Avraam D, Wilson R, Aguirre Chan N, Banerjee S, Bishop T, Butters O, Cadman T, Cederkvist L, Duijts L, Escribà Montagut X, Garner H, Gonçalves G, González J, Haakma S, Hartlev M, Hasenauer J, Huth M, Hyde E, Jaddoe V, Marcon Y, Mayrhofer M, Molnar-Gabor F, Morgan , Murtagh M, Nestor M, Nybo Andersen , Parker S, Pinot de Moira , Schwarz F, Strandberg-Larsen K, Swertz M, Welten M, Wheater S, Burton P (2024). “DataSHIELD: mitigating disclosure risk multi-site federated analysis platform.” Bioinformatics Advances, 5(1), 1-21. https://doi.org/10.1093/bioadv/vbaf046. Note: Apple Mx architecture users, please aware numerical limitations platform, leads unexpected results using base R packages, like stats​. x <- c(0, 3, 7) 1 - cor(x, x)​ result value zero. Also See: details see https://cran.r-project.org/doc/FAQ/R-FAQ.html#-doesn_0027t-R-think--numbers--equal_003f bug report: https://bugs.r-project.org/show_bug.cgi?id=18941","code":""},{"path":"/reference/checkClass.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks that an object has the same class in all studies — checkClass","title":"Checks that an object has the same class in all studies — checkClass","text":"internal function.","code":""},{"path":"/reference/checkClass.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks that an object has the same class in all studies — checkClass","text":"","code":"checkClass(datasources = NULL, obj = NULL)"},{"path":"/reference/checkClass.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks that an object has the same class in all studies — checkClass","text":"datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. obj string character, name object check .","code":""},{"path":"/reference/checkClass.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks that an object has the same class in all studies — checkClass","text":"message class object object class studies.","code":""},{"path":"/reference/checkClass.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks that an object has the same class in all studies — checkClass","text":"DataSHIELD object included analysis must type collaborating studies. case process stopped","code":""},{"path":"/reference/colPercent.html","id":null,"dir":"Reference","previous_headings":"","what":"Produces column percentages — colPercent","title":"Produces column percentages — colPercent","text":"INTERNAL function.","code":""},{"path":"/reference/colPercent.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Produces column percentages — colPercent","text":"","code":"colPercent(dataframe)"},{"path":"/reference/colPercent.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Produces column percentages — colPercent","text":"dataframe data frame","code":""},{"path":"/reference/colPercent.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Produces column percentages — colPercent","text":"data frame","code":""},{"path":"/reference/colPercent.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Produces column percentages — colPercent","text":"function required required client function ds.table2D.","code":""},{"path":"/reference/colPercent.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Produces column percentages — colPercent","text":"Gaye, .","code":""},{"path":"/reference/computeWeightedMeans.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute Weighted Mean by Group — computeWeightedMeans","title":"Compute Weighted Mean by Group — computeWeightedMeans","text":"function originally panelaggregation package. ported order bypass package kicked CRAN.","code":""},{"path":"/reference/computeWeightedMeans.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute Weighted Mean by Group — computeWeightedMeans","text":"","code":"computeWeightedMeans(data_table, variables, weight, by)"},{"path":"/reference/computeWeightedMeans.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute Weighted Mean by Group — computeWeightedMeans","text":"data_table data.table variables character name variable(s) focus . variables must data.table weight character name data.table column contains weight. character vector columns group ","code":""},{"path":"/reference/computeWeightedMeans.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute Weighted Mean by Group — computeWeightedMeans","text":"Returns data table object computed weighted means.","code":""},{"path":"/reference/computeWeightedMeans.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Compute Weighted Mean by Group — computeWeightedMeans","text":"Matthias Bannert, Gabriel Bucur","code":""},{"path":"/reference/dot-pool_md_patterns.html","id":null,"dir":"Reference","previous_headings":"","what":"Pool missing data patterns across studies — .pool_md_patterns","title":"Pool missing data patterns across studies — .pool_md_patterns","text":"Internal function pool md.pattern results multiple studies","code":""},{"path":"/reference/dot-pool_md_patterns.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Pool missing data patterns across studies — .pool_md_patterns","text":"","code":".pool_md_patterns(patterns_list, study_names)"},{"path":"/reference/dot-pool_md_patterns.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Pool missing data patterns across studies — .pool_md_patterns","text":"patterns_list List pattern matrices study study_names Names studies","code":""},{"path":"/reference/dot-pool_md_patterns.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Pool missing data patterns across studies — .pool_md_patterns","text":"Pooled pattern matrix","code":""},{"path":"/reference/ds.Boole.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into Boolean indicators — ds.Boole","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"compares R objects using standard set Boolean operators (==, !=, >, >=, <, <=) create vector Boolean indicators can class logical (TRUE/FALSE) numeric (1/0).","code":""},{"path":"/reference/ds.Boole.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"","code":"ds.Boole( V1 = NULL, V2 = NULL, Boolean.operator = NULL, numeric.output = TRUE, na.assign = \"NA\", newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.Boole.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"V1 character string specifying name vector Boolean operator applied. V2 character string specifying name vector compare V1. Boolean.operator character string specifying one six possible Boolean operators: '==', '!=', '>', '>=', '<' '<='. numeric.output logical. TRUE output variable class numeric (1/0). FALSE output variable class logical (TRUE/FALSE). Default TRUE. na.assign character string taking values 'NA','1' '0'. Default 'NA'. information see details. newobj character string provides name output object stored data servers. Default boole.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.Boole.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"ds.Boole returns object specified newobj argument written server-side. Also, two validity messages returned client-side indicating name newobj created data source valid form.","code":""},{"path":"/reference/ds.Boole.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"combination different Boolean operators using operator can obtained multiplying two binary/Boolean vectors together. way, observations taking value 1 every vector take value 1 final vector (multiplication) others take value 0. Instead combination using operator can obtained sum two vectors applying ds.Boole using operator >= 1. na.assign 'NA' specified, missing values remain NAs output vector. '1' '0' specified missing values converted 1 0 respectively TRUE FALSE depending argument numeric.output. Server function called: BooleDS","code":""},{"path":"/reference/ds.Boole.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.Boole.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into Boolean indicators — ds.Boole","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Generating Boolean indicators ds.Boole(V1 = \"D$LAB_TSC\", V2 = \"D$LAB_TRIG\", Boolean.operator = \">\", numeric.output = TRUE, #Output vector of 0 and 1 na.assign = \"NA\", newobj = \"Boole.vec\", datasources = connections[1]) #only the first server is used (\"study1\") ds.Boole(V1 = \"D$LAB_TSC\", V2 = \"D$LAB_TRIG\", Boolean.operator = \"<\", numeric.output = FALSE, #Output vector of TRUE and FALSE na.assign = \"1\", #NA values are converted to TRUE newobj = \"Boole.vec\", datasources = connections[2]) #only the second server is used (\"study2\") ds.Boole(V1 = \"D$LAB_TSC\", V2 = \"D$LAB_TRIG\", Boolean.operator = \">\", numeric.output = TRUE, #Output vector of 0 and 1 na.assign = \"0\", #NA values are converted to 0 newobj = \"Boole.vec\", datasources = connections) #All servers are used # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.abs.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the absolute values of a variable — ds.abs","title":"Computes the absolute values of a variable — ds.abs","text":"Computes absolute values specified numeric integer vector. function similar R function abs.","code":""},{"path":"/reference/ds.abs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the absolute values of a variable — ds.abs","text":"","code":"ds.abs(x = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.abs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the absolute values of a variable — ds.abs","text":"x character string providing name numeric integer vector. newobj character string provides name output variable stored data servers. Default name set abs.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.abs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the absolute values of a variable — ds.abs","text":"ds.abs assigns vector study includes absolute values input numeric integer vector specified argument x. created vectors stored servers.","code":""},{"path":"/reference/ds.abs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the absolute values of a variable — ds.abs","text":"function calls server-side function absDS computes absolute values elements numeric integer vector assigns new vector absolute values server-side. name new generated vector specified user argument newobj, otherwise named default abs.newobj.","code":""},{"path":"/reference/ds.abs.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the absolute values of a variable — ds.abs","text":"Demetris Avraam DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.abs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the absolute values of a variable — ds.abs","text":"","code":"if (FALSE) { # \\dontrun{ # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Generate a normally distributed variable with zero mean and variance equal # to one and then get their absolute values ds.rNorm(samp.size=100, mean=0, sd=1, newobj='var.norm', datasources=connections) # check the quantiles ds.summary(x='var.norm', datasources=connections) ds.abs(x='var.norm', newobj='var.norm.abs', datasources=connections) # check now the changes in the quantiles ds.summary(x='var.norm.abs', datasources=connections) # Example 2: Generate a sequence of negative integer numbers from -200 to -100 # and then get their absolute values ds.seq(FROM.value.char = '-200', TO.value.char = '-100', BY.value.char = '1', newobj='negative.integers', datasources=connections) # check the quantiles ds.summary(x='negative.integers', datasources=connections) ds.abs(x='negative.integers', newobj='positive.integers', datasources=connections) # check now the changes in the quantiles ds.summary(x='positive.integers', datasources=connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asCharacter.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into a character class — ds.asCharacter","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"Converts input object character class. function based native R function .character.","code":""},{"path":"/reference/ds.asCharacter.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"","code":"ds.asCharacter(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asCharacter.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"x.name character string providing name input object coerced class character. newobj character string provides name output object stored data servers. Default ascharacter.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asCharacter.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"ds.asCharacter returns object converted class character written server-side.","code":""},{"path":"/reference/ds.asCharacter.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"Server function called: asCharacterDS","code":""},{"path":"/reference/ds.asCharacter.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asCharacter.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into a character class — ds.asCharacter","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into a class character ds.asCharacter(x.name = \"D$LAB_TSC\", newobj = \"char.obj\", datasources = connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asDataMatrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into a matrix — ds.asDataMatrix","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"Coerces R object matrix maintaining original class columns data frames.","code":""},{"path":"/reference/ds.asDataMatrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"","code":"ds.asDataMatrix(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asDataMatrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"x.name character string providing name input object coerced matrix. newobj character string provides name output object stored data servers. Default asdatamatrix.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asDataMatrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"ds.asDataMatrix returns object converted matrix written server-side.","code":""},{"path":"/reference/ds.asDataMatrix.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"function based native R function data.matrix. Server function called: asDataMatrixDS.","code":""},{"path":"/reference/ds.asDataMatrix.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asDataMatrix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into a matrix — ds.asDataMatrix","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into a matrix ds.asDataMatrix(x.name = \"D\", newobj = \"mat.obj\", datasources = connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asFactor.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side numeric vector into a factor — ds.asFactor","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"function assigns server-side numeric vector factor class.","code":""},{"path":"/reference/ds.asFactor.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"","code":"ds.asFactor( input.var.name = NULL, newobj.name = NULL, forced.factor.levels = NULL, fixed.dummy.vars = FALSE, baseline.level = 1, datasources = NULL )"},{"path":"/reference/ds.asFactor.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"input.var.name character string provides name variable converted factor. newobj.name character string provides name output variable stored data servers. Default asfactor.newobj. forced.factor.levels levels user wants split input variable. NULL (default) vector unique levels studies created. fixed.dummy.vars boolean. TRUE input variable converted factor presented matrix dummy variables. FALSE (default) input variable converted factor assigned vector. baseline.level integer indicating baseline level used creation matrix dummy variables. fixed.dummy.vars set FALSE value baseline level taken account. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asFactor.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"ds.asFactor returns unique levels converted variable ascending order validity message name created object client-side output matrix vector server-side.","code":""},{"path":"/reference/ds.asFactor.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"Converts numeric vector factor type represented either vector matrix dummy variables depending argument fixed.dummy.vars. matrix dummy variables also depends argument baseline.level. ds.asFactor.R associated serverside functions asFactorDS1 asFactorDS2 used variable 40 unique levels across sources combined. one sources contain subjects particular level, level still created empty category. end sources thus include factor variable consistent factor levels across sources - one level every unique value occurs least one source. important wish fit models using ds.glm factor levels must consistent across studies model fit. order possible, sources share unique values source holds variable. allows client create single vector containing unique factor levels across sources. potentially disclosive many levels. therefore two checks number levels source. One simply test whether number levels exceeds value specified Roption value 'nfilter.max.levels' set default 40, data custodian source can choose alternative value /chooses. second test whether levels dense: ie number levels exceed specified proportion full length relevant vector particular source. max density set Roption value 'nfilter.levels' takes default value 0.33 can modified data custodian. combination, two checks mean factor 35 levels given study total length variable converted factor 1000 individuals, ds.asFactor function process variable appropriately. 45 levels blocked 'nfilter.max.levels' total length variable study 70 subjects blocked density criterion held 'nfilter.levels'. factor 40 levels source - perhaps commonly ID sort need provide argument eg tapply function. use ds.asFactor. Typically circumstance simply want create factor appropriate source need ensure levels consistent across sources. case, can use ds.asFactorSimple function coerce numeric character variable factor. need share unique factor levels sources, disclosure issue. understand matrix dummy variable created assume vector (1, 2, 1, 3, 4, 4, 1, 3, 4, 5) ten integer numbers. set argument fixed.dummy.vars = TRUE, baseline.level = 1 forced.factor.levels = c(1,2,3,4,5). input vector converted following matrix dummy variables: example baseline.level = 3 matrix : first instance first row matrix zeros entries indicating first data point belongs level 1 (baseline level equal 1). second row 1 first (DV2) column zeros elsewhere, indicating second data point belongs level 2. second instance (second matrix) baseline level equal 3, first row matrix 1 first (DV1) column zeros elsewhere, indicating first data point belongs level 1. Also can see fourth row second matrix elements equal zero indicating fourth data point belongs level 3 (baseline level, case, 3). baseline.level set equal value one levels factor matrix dummy variables created many columns number levels. case row unique entry equal 1 certain column indicating level data point. , example vector five levels set baseline.level equal value belong five levels (baseline.level=8) matrix dummy variables : Server functions called: asFactorDS1 asFactorDS2","code":""},{"path":"/reference/ds.asFactor.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.asFactor.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side numeric vector into a factor — ds.asFactor","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") ds.asFactor(input.var.name = \"D$PM_BMI_CATEGORICAL\", newobj.name = \"fact.obj\", forced.factor.levels = NULL, #a vector with all unique levels #from all studies is created fixed.dummy.vars = TRUE, #create a matrix of dummy variables baseline.level = 1, datasources = connections)#all the Opal servers are used, in this case 3 #(see above the connection to the servers) ds.asFactor(input.var.name = \"D$PM_BMI_CATEGORICAL\", newobj.name = \"fact.obj\", forced.factor.levels = c(2,3), #the variable is split in 2 levels fixed.dummy.vars = TRUE, #create a matrix of dummy variables baseline.level = 1, datasources = connections[1])#only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asFactorSimple.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a numeric vector into a factor — ds.asFactorSimple","title":"Converts a numeric vector into a factor — ds.asFactorSimple","text":"ds.asFactorSimple calls assign function asFactorSimpleDS thereby coerces numeric character vector factor","code":""},{"path":"/reference/ds.asFactorSimple.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a numeric vector into a factor — ds.asFactorSimple","text":"","code":"ds.asFactorSimple( input.var.name = NULL, newobj.name = NULL, datasources = NULL )"},{"path":"/reference/ds.asFactorSimple.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a numeric vector into a factor — ds.asFactorSimple","text":"input.var.name character string provides name variable converted factor. newobj.name character string provides name output variable stored data servers. Default asfactor.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asFactorSimple.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a numeric vector into a factor — ds.asFactorSimple","text":"output vector class factor serverside. addition, returns validity message name created object client-side creation fails error message can viewed using datashield.errors().","code":""},{"path":"/reference/ds.asFactorSimple.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a numeric vector into a factor — ds.asFactorSimple","text":"function converts input variable factor. Unlike ds.asFactor serverside functions, ds.asFactorSimple coerce class variable make factor serverside data source. check enforce consistency factor levels across sources allow force arbitrary set levels unless levels actually exist sources. Furthermore, allow create array binary dummy variables equivalent factor. need things use ds.asFactor function.","code":""},{"path":"/reference/ds.asFactorSimple.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a numeric vector into a factor — ds.asFactorSimple","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.asInteger.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into an integer class — ds.asInteger","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"Coerces R object integer class. function based native R function .integer.","code":""},{"path":"/reference/ds.asInteger.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"","code":"ds.asInteger(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asInteger.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"x.name character string providing name input object coerced integer. newobj character string provides name output object stored data servers. Default asinteger.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asInteger.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"ds.asInteger returns R object converted integer written server-side.","code":""},{"path":"/reference/ds.asInteger.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"function based native R function .integer. difference DataSHIELD function first converts values input object characters convert integers. addition, important case input object class factor integers levels. case, native R .integer function returns underlying level codes values integers. example .integer R converts factor vector: [1] 0 1 1 2 1 0 1 0 2 2 2 1 Levels: 0 1 2 following integer vector: 1 2 2 3 2 1 2 1 3 3 3 2 Server function called: asIntegerDS","code":""},{"path":"/reference/ds.asInteger.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asInteger.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into an integer class — ds.asInteger","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into an integer ds.asInteger(x.name = \"D$LAB_TSC\", newobj = \"int.obj\", datasources = connections[1]) #only the first Opal server is used (\"study1\") ds.class(x = \"int.obj\", datasources = connections[1]) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asList.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into a list — ds.asList","title":"Converts a server-side R object into a list — ds.asList","text":"Coerces R object list. function based native R function .list.","code":""},{"path":"/reference/ds.asList.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into a list — ds.asList","text":"","code":"ds.asList(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asList.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into a list — ds.asList","text":"x.name character string providing name input object coerced list. newobj character string provides name output object stored data servers. Default aslist.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asList.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into a list — ds.asList","text":"ds.asList returns R object converted list written server-side.","code":""},{"path":"/reference/ds.asList.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into a list — ds.asList","text":"Server function called: asListDS","code":""},{"path":"/reference/ds.asList.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into a list — ds.asList","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asList.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into a list — ds.asList","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into a List ds.asList(x.name = \"D\", newobj = \"D.asList\", datasources = connections[1]) #only the first Opal server is used (\"study1\") ds.class(x = \"D.asList\", datasources = connections[1]) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asLogical.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into a logical class — ds.asLogical","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"Coerces R object logical class. function based native R function .logical.","code":""},{"path":"/reference/ds.asLogical.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"","code":"ds.asLogical(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asLogical.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"x.name character string providing name input object coerced logical. newobj character string provides name output object stored data servers. Default aslogical.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asLogical.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"ds.asLogical returns R object converted logical written server-side.","code":""},{"path":"/reference/ds.asLogical.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"Server function called: asLogicalDS","code":""},{"path":"/reference/ds.asLogical.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asLogical.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into a logical class — ds.asLogical","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into a logical ds.asLogical(x.name = \"D$LAB_TSC\", newobj = \"logical.obj\", datasources =connections[1]) #only the first Opal server is used (\"study1\") ds.class(x = \"logical.obj\", datasources = connections[1]) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asMatrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into a matrix — ds.asMatrix","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"Coerces R object matrix. converts columns character class.","code":""},{"path":"/reference/ds.asMatrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"","code":"ds.asMatrix(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asMatrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"x.name character string providing name input object coerced matrix. newobj character string provides name output object stored data servers. Default asmatrix.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asMatrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"ds.asMatrix returns object converted matrix written server-side.","code":""},{"path":"/reference/ds.asMatrix.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"function based native R function .matrix. function applied data frame, columns converted character class. wish convert data frame matrix maintain data columns original class use function ds.asDataMatrix. Server function called: asMatrixDS","code":""},{"path":"/reference/ds.asMatrix.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asMatrix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into a matrix — ds.asMatrix","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into a matrix ds.asMatrix(x.name = \"D\", newobj = \"mat.obj\", datasources = connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.asNumeric.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts a server-side R object into a numeric class — ds.asNumeric","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"Coerces R object numeric class. function based native R function .numeric.","code":""},{"path":"/reference/ds.asNumeric.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"","code":"ds.asNumeric(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.asNumeric.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"x.name character string providing name input object coerced numeric. newobj character string provides name output object stored data servers. Default asnumeric.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.asNumeric.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"ds.asNumeric returns R object converted numeric class written server-side.","code":""},{"path":"/reference/ds.asNumeric.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"function based native R function .numeric. However, behaves differently specific classes variables. example, input object class factor, first converts values characters convert numerics. behaviour important case input object class factor numbers levels. case, native R .numeric function returns underlying level codes values numbers. example .numeric R converts factor vector: 0 1 1 2 1 0 1 0 2 2 2 1 Levels: 0 1 2 following numeric vector: 1 2 2 3 2 1 2 1 3 3 3 2 contrast DataSHIELD converts input factor numeric levels original numeric values. Server function called: asNumericDS","code":""},{"path":"/reference/ds.asNumeric.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.asNumeric.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Converts a server-side R object into a numeric class — ds.asNumeric","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Converting the R object into a numeric class ds.asNumeric(x.name = \"D$LAB_TSC\", newobj = \"num.obj\", datasources = connections[1]) #only the first Opal server is used (\"study1\") ds.class(x = \"num.obj\", datasources = connections[1]) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.assign.html","id":null,"dir":"Reference","previous_headings":"","what":"Assigns an R object to a name in the server-side — ds.assign","title":"Assigns an R object to a name in the server-side — ds.assign","text":"function assigns datashield object name, hence creating new object.","code":""},{"path":"/reference/ds.assign.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assigns an R object to a name in the server-side — ds.assign","text":"","code":"ds.assign(toAssign = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.assign.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assigns an R object to a name in the server-side — ds.assign","text":"toAssign character string providing object assign. newobj character string provides name output object stored data servers. Default assign.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.assign.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assigns an R object to a name in the server-side — ds.assign","text":"ds.assign returns R object assigned name written server-side.","code":""},{"path":"/reference/ds.assign.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Assigns an R object to a name in the server-side — ds.assign","text":"new object stored server-side. ds.assign causes remote assignment using DSI::datashield.assign. toAssign argument checked server assigned variable called newobj server-side.","code":""},{"path":"/reference/ds.assign.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Assigns an R object to a name in the server-side — ds.assign","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.assign.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Assigns an R object to a name in the server-side — ds.assign","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Assign a variable to a name ds.assign(toAssign = \"D$LAB_TSC\", newobj = \"labtsc\", datasources = connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.auc.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates the Area under the curve (AUC) — ds.auc","title":"Calculates the Area under the curve (AUC) — ds.auc","text":"function calculates C-statistic AUC logistic regression models.","code":""},{"path":"/reference/ds.auc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates the Area under the curve (AUC) — ds.auc","text":"","code":"ds.auc(pred = NULL, y = NULL, datasources = NULL)"},{"path":"/reference/ds.auc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates the Area under the curve (AUC) — ds.auc","text":"pred name vector predicted values y name outcome variable. Note variable include complete cases used regression model. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.auc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates the Area under the curve (AUC) — ds.auc","text":"returns AUC standard error","code":""},{"path":"/reference/ds.auc.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates the Area under the curve (AUC) — ds.auc","text":"AUC determines discriminative ability model.","code":""},{"path":"/reference/ds.auc.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates the Area under the curve (AUC) — ds.auc","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.boxPlot.html","id":null,"dir":"Reference","previous_headings":"","what":"Draw boxplot — ds.boxPlot","title":"Draw boxplot — ds.boxPlot","text":"Draw boxplot data study servers (data frames numeric vectors) option grouping using categorical variables dataset (data frames)","code":""},{"path":"/reference/ds.boxPlot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Draw boxplot — ds.boxPlot","text":"","code":"ds.boxPlot( x, variables = NULL, group = NULL, group2 = NULL, xlabel = \"x axis\", ylabel = \"y axis\", type = \"pooled\", datasources = NULL )"},{"path":"/reference/ds.boxPlot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Draw boxplot — ds.boxPlot","text":"x character Name data frame (numeric vector) server side holds information plotted variables character vector Name column(s) data frame include boxplot group character (default NULL) Name first grouping variable. group2 character (default NULL) Name second grouping variable. xlabel caracter (default \"x axis\") Label put x axis plot ylabel caracter (default \"y axis\") Label put y axis plot type character Return pooled plot (\"pooled\") split plot (one study server \"split\") datasources list DSConnection-class (default NULL) objects obtained login","code":""},{"path":"/reference/ds.boxPlot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Draw boxplot — ds.boxPlot","text":"ggplot object","code":""},{"path":[]},{"path":"/reference/ds.boxPlotGG.html","id":null,"dir":"Reference","previous_headings":"","what":"Renders boxplot — ds.boxPlotGG","title":"Renders boxplot — ds.boxPlotGG","text":"Internal function. Renders ggplot boxplot retrieving server side list identity stats parameters render plot without passing data original dataset","code":""},{"path":"/reference/ds.boxPlotGG.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Renders boxplot — ds.boxPlotGG","text":"","code":"ds.boxPlotGG( x, group = NULL, group2 = NULL, xlabel = \"x axis\", ylabel = \"y axis\", type = \"pooled\", datasources = NULL )"},{"path":"/reference/ds.boxPlotGG.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Renders boxplot — ds.boxPlotGG","text":"x character Name server side data frame form boxplot. Structure server object must : Column 'x': Names X axis boxplot, aka variables plot Column 'value': Values variable (raw data columns rbinded) Column 'group': (Optional) Values grouping variable Column 'group2': (Optional) Values second grouping variable group character (default NULL) Name first grouping variable. group2 character (default NULL) Name second grouping variable. xlabel caracter (default \"x axis\") Label put x axis plot ylabel caracter (default \"y axis\") Label put y axis plot type character Return pooled plot (\"pooled\") split plot (one study server \"split\") datasources list DSConnection-class (default NULL) objects obtained login","code":""},{"path":"/reference/ds.boxPlotGG.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Renders boxplot — ds.boxPlotGG","text":"ggplot object","code":""},{"path":"/reference/ds.boxPlotGG_data_Treatment.html","id":null,"dir":"Reference","previous_headings":"","what":"Take a data frame on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment","title":"Take a data frame on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment","text":"Internal function","code":""},{"path":"/reference/ds.boxPlotGG_data_Treatment.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Take a data frame on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment","text":"","code":"ds.boxPlotGG_data_Treatment( table, variables, group = NULL, group2 = NULL, datasources = NULL )"},{"path":"/reference/ds.boxPlotGG_data_Treatment.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Take a data frame on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment","text":"table character Name table server side holds information plotted later variables character vector Name column(s) data frame include boxplot group character (default NULL) Name first grouping variable. group2 character (default NULL) Name second grouping variable. datasources list DSConnection-class (default NULL) objects obtained login","code":""},{"path":"/reference/ds.boxPlotGG_data_Treatment.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Take a data frame on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment","text":"return nothing, creates table \"boxPlotRawData\" server arranged passed ggplot boxplot function. Structure created table: Column 'x': Names X axis boxplot, aka variables plot Column 'value': Values variable (raw data columns rbinded) Column 'group': (Optional) Values grouping variable Column 'group2': (Optional) Values second grouping variable","code":""},{"path":"/reference/ds.boxPlotGG_data_Treatment_numeric.html","id":null,"dir":"Reference","previous_headings":"","what":"Take a vector on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment_numeric","title":"Take a vector on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment_numeric","text":"Internal function","code":""},{"path":"/reference/ds.boxPlotGG_data_Treatment_numeric.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Take a vector on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment_numeric","text":"","code":"ds.boxPlotGG_data_Treatment_numeric(vector, datasources = NULL)"},{"path":"/reference/ds.boxPlotGG_data_Treatment_numeric.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Take a vector on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment_numeric","text":"vector character Name table server side holds information plotted later datasources list DSConnection-class (default NULL) objects obtained login","code":""},{"path":"/reference/ds.boxPlotGG_data_Treatment_numeric.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Take a vector on the server side an arrange it to pass it to the boxplot function — ds.boxPlotGG_data_Treatment_numeric","text":"return nothing, creates table \"boxPlotRawDataNumeric\" server arranged passed ggplot boxplot function. Structure created table: Column 'x': Names X axis boxplot, aka name vector (vector argument) Column 'value': Values variable","code":""},{"path":"/reference/ds.boxPlotGG_numeric.html","id":null,"dir":"Reference","previous_headings":"","what":"Draw boxplot with information from a numeric vector — ds.boxPlotGG_numeric","title":"Draw boxplot with information from a numeric vector — ds.boxPlotGG_numeric","text":"Draw boxplot information numeric vector","code":""},{"path":"/reference/ds.boxPlotGG_numeric.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Draw boxplot with information from a numeric vector — ds.boxPlotGG_numeric","text":"","code":"ds.boxPlotGG_numeric( x, xlabel = \"x axis\", ylabel = \"y axis\", type = \"pooled\", datasources = NULL )"},{"path":"/reference/ds.boxPlotGG_numeric.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Draw boxplot with information from a numeric vector — ds.boxPlotGG_numeric","text":"x character Name numeric vector server side holds information plotted xlabel caracter (default \"x axis\") Label put x axis plot ylabel caracter (default \"y axis\") Label put y axis plot type character Return pooled plot (\"pooled\") split plot (one study server \"split\") datasources list DSConnection-class (default NULL) objects obtained login","code":""},{"path":"/reference/ds.boxPlotGG_numeric.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Draw boxplot with information from a numeric vector — ds.boxPlotGG_numeric","text":"ggplot object","code":""},{"path":"/reference/ds.boxPlotGG_table.html","id":null,"dir":"Reference","previous_headings":"","what":"Draw boxplot with information from a data frame — ds.boxPlotGG_table","title":"Draw boxplot with information from a data frame — ds.boxPlotGG_table","text":"Draws boxplot option adding two grouping variables data held table","code":""},{"path":"/reference/ds.boxPlotGG_table.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Draw boxplot with information from a data frame — ds.boxPlotGG_table","text":"","code":"ds.boxPlotGG_table( x, variables, group = NULL, group2 = NULL, xlabel = \"x axis\", ylabel = \"y axis\", type = \"pooled\", datasources = NULL )"},{"path":"/reference/ds.boxPlotGG_table.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Draw boxplot with information from a data frame — ds.boxPlotGG_table","text":"x character Name table server side holds information plotted variables character vector Name column(s) data frame include boxplot group character (default NULL) Name first grouping variable. group2 character (default NULL) Name second grouping variable. xlabel caracter (default \"x axis\") Label put x axis plot ylabel caracter (default \"y axis\") Label put y axis plot type character Return pooled plot (\"pooled\") split plot (one study server \"split\") datasources list DSConnection-class (default NULL) objects obtained login","code":""},{"path":"/reference/ds.boxPlotGG_table.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Draw boxplot with information from a data frame — ds.boxPlotGG_table","text":"ggplot object","code":""},{"path":"/reference/ds.bp_standards.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates Blood pressure z-scores — ds.bp_standards","title":"Calculates Blood pressure z-scores — ds.bp_standards","text":"function calculates blood pressure z-scores two steps: Step 1. Calculates z-score height according CDC growth chart (growth chart!). Step 2. Calculates z-score BP according fourth report BP management, USA","code":""},{"path":"/reference/ds.bp_standards.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates Blood pressure z-scores — ds.bp_standards","text":"","code":"ds.bp_standards( sex = NULL, age = NULL, height = NULL, bp = NULL, systolic = TRUE, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.bp_standards.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates Blood pressure z-scores — ds.bp_standards","text":"sex name sex variable. variable coded 1 males 2 females. coded differently (e.g. 0/1), can use ds.recodeValues function recode categories 1/2 use ds.bp_standards age name age variable years. height name height variable cm. bp name blood pressure variable. systolic logical. TRUE (default) function assumes conversion systolic blood pressure. FALSE function assumes conversion diastolic blood pressure. newobj character string provides name output object stored data servers. Default name set bp.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.bp_standards.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates Blood pressure z-scores — ds.bp_standards","text":"assigns new object server-side. assigned object list two elements: 'Zbp' zscores blood pressure 'perc' percentiles BP zscores.","code":""},{"path":"/reference/ds.bp_standards.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Calculates Blood pressure z-scores — ds.bp_standards","text":"fourth report diagnosis, evaluation, treatment high blood pressure children adolescents: https://www.nhlbi.nih.gov/sites/default/files/media/docs/hbp_ped.pdf","code":""},{"path":"/reference/ds.bp_standards.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates Blood pressure z-scores — ds.bp_standards","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.c.html","id":null,"dir":"Reference","previous_headings":"","what":"Combines values into a vector or list in the server-side — ds.c","title":"Combines values into a vector or list in the server-side — ds.c","text":"Concatenates objects one vector.","code":""},{"path":"/reference/ds.c.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Combines values into a vector or list in the server-side — ds.c","text":"","code":"ds.c(x = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.c.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Combines values into a vector or list in the server-side — ds.c","text":"x vector character string providing names objects combined. newobj character string provides name output object stored data servers. Default c.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.c.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Combines values into a vector or list in the server-side — ds.c","text":"ds.c returns vector concatenating R objects written server-side.","code":""},{"path":"/reference/ds.c.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Combines values into a vector or list in the server-side — ds.c","text":"avoid combining character names vectors client-side, names coerced list server-side function loops list concatenate list's elements vector. Server function called: cDS","code":""},{"path":"/reference/ds.c.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Combines values into a vector or list in the server-side — ds.c","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.c.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Combines values into a vector or list in the server-side — ds.c","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Create a vector with combined objects myvect <- c(\"D$LAB_TSC\", \"D$LAB_HDL\") ds.c(x = myvect, newobj = \"new.vect\", datasources = connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.cbind.html","id":null,"dir":"Reference","previous_headings":"","what":"Combines R objects by columns in the server-side — ds.cbind","title":"Combines R objects by columns in the server-side — ds.cbind","text":"Takes sequence vector, matrix data-frame arguments combines column produce data-frame.","code":""},{"path":"/reference/ds.cbind.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Combines R objects by columns in the server-side — ds.cbind","text":"","code":"ds.cbind( x = NULL, DataSHIELD.checks = FALSE, force.colnames = NULL, newobj = NULL, datasources = NULL, notify.of.progress = FALSE )"},{"path":"/reference/ds.cbind.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Combines R objects by columns in the server-side — ds.cbind","text":"x character vector name objects combined. DataSHIELD.checks logical. TRUE four checks: 1. input object(s) () defined studies. 2. input object(s) () legal class studies. 3. duplicated column names input objects study. 4. number rows components cbind. Default FALSE. force.colnames can NULL (recommended) vector characters specifies column names output object. NULL user take caution. information see Details. newobj character string provides name output variable stored data servers. Defaults cbind.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. notify..progress specifies console output produced indicate progress. Default FALSE.","code":""},{"path":"/reference/ds.cbind.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Combines R objects by columns in the server-side — ds.cbind","text":"ds.cbind returns data frame combining columns R objects specified function written server-side. also returns client-side two messages name newobj created data source DataSHIELD.checks result.","code":""},{"path":"/reference/ds.cbind.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Combines R objects by columns in the server-side — ds.cbind","text":"sequence vector, matrix data-frame arguments combined column column produce data-frame written server-side. function similar native R function cbind. DataSHIELD.checks checks relatively slow. Default DataSHIELD.checks value FALSE. force.colnames NULL (recommended), column names inferred names column names first object specified x argument. argument NULL, column names assigned data.frame order characters specified user argument. Therefore, vector force.colnames must number elements columns output object. multi-site DataSHIELD setting use argument, user make sure study number names column names input elements specified x argument order studies. Server function called: cbindDS","code":""},{"path":"/reference/ds.cbind.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Combines R objects by columns in the server-side — ds.cbind","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.cbind.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Combines R objects by columns in the server-side — ds.cbind","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Assign the exponent of a numeric variable at each server and cbind it # to the data frame D ds.exp(x = \"D$LAB_HDL\", newobj = \"LAB_HDL.exp\", datasources = connections) ds.cbind(x = c(\"D\", \"LAB_HDL.exp\"), DataSHIELD.checks = FALSE, newobj = \"D.cbind.1\", datasources = connections) # Example 2: If there are duplicated column names in the input objects the function adds # a suffix '.k' to the kth replicate\". If also the argument DataSHIELD.checks is set to TRUE # the function returns a warning message notifying the user for the existence of any duplicated # column names in each study ds.cbind(x = c(\"LAB_HDL.exp\", \"LAB_HDL.exp\"), DataSHIELD.checks = TRUE, newobj = \"D.cbind.2\", datasources = connections) ds.colnames(x = \"D.cbind.2\", datasources = connections) # Example 3: Generate a random normally distributed variable of length 100 at each study, # and cbind it to the data frame D. This example fails and returns an error as the length # of the generated variable \"norm.var\" is not the same as the number of rows in the data frame D ds.rNorm(samp.size = 100, newobj = \"norm.var\", datasources = connections) ds.cbind(x = c(\"D\", \"norm.var\"), DataSHIELD.checks = FALSE, newobj = \"D.cbind.3\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.changeRefGroup.html","id":null,"dir":"Reference","previous_headings":"","what":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"Change reference level factor, putting reference group first. function similar R function relevel.","code":""},{"path":"/reference/ds.changeRefGroup.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"","code":"ds.changeRefGroup( x = NULL, ref = NULL, newobj = NULL, reorderByRef = FALSE, datasources = NULL )"},{"path":"/reference/ds.changeRefGroup.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"x character string providing name input vector type factor. ref reference level. newobj character string provides name output object stored server-side. Default changerefgroup.newobj. reorderByRef logical, TRUE new vector ordered reference group (.e. putting reference group first). default re-order (see reasons details). datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.changeRefGroup.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"ds.changeRefGroup returns new vector specified level reference written server-side.","code":""},{"path":"/reference/ds.changeRefGroup.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"function allows user re-order vector, putting reference group first. mentioned default reference first level vector levels. user chooses re-order warning issued can introduce mismatch values vector put back table reordered way. mismatch can render results operations table invalid. Server function called: changeRefGroupDS","code":""},{"path":[]},{"path":"/reference/ds.changeRefGroup.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.changeRefGroup.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Changes the reference level of a factor in the server-side — ds.changeRefGroup","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Changing the reference group in the server-side # Example 1: rename the categories and change the reference with re-ordering # print out the levels of the initial vector ds.levels(x= \"D$PM_BMI_CATEGORICAL\", datasources = connections) # define a vector with the new levels and recode the initial levels newNames <- c(\"normal\", \"overweight\", \"obesity\") ds.recodeLevels(x = \"D$PM_BMI_CATEGORICAL\", newCategories = newNames, newobj = \"bmi_new\", datasources = connections) # print out the levels of the new vector ds.levels(x = \"bmi_new\", datasources = connections) # Set the reference to \"obesity\" without changing the order (default) ds.changeRefGroup(x = \"bmi_new\", ref = \"obesity\", newobj = \"bmi_ob\", datasources = connections) # print out the levels; the first listed level (i.e. the reference) is now 'obesity' ds.levels(x = \"bmi_ob\", datasources = connections) # Example 2: change the reference and re-order by the reference level # If re-ordering is sought, the action is completed but a warning is issued ds.recodeLevels(x = \"D$PM_BMI_CATEGORICAL\", newCategories = newNames, newobj = \"bmi_new\", datasources = connections) ds.changeRefGroup(x = \"bmi_new\", ref = \"obesity\", newobj = \"bmi_ob\", reorderByRef = TRUE, datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.class.html","id":null,"dir":"Reference","previous_headings":"","what":"Class of the R object in the server-side — ds.class","title":"Class of the R object in the server-side — ds.class","text":"Retrieves class R object. function similar R function class.","code":""},{"path":"/reference/ds.class.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Class of the R object in the server-side — ds.class","text":"","code":"ds.class(x = NULL, datasources = NULL)"},{"path":"/reference/ds.class.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Class of the R object in the server-side — ds.class","text":"x character string providing name input R object. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.class.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Class of the R object in the server-side — ds.class","text":"ds.class returns type R object.","code":""},{"path":"/reference/ds.class.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Class of the R object in the server-side — ds.class","text":"native R function class. Server function called: classDS","code":""},{"path":[]},{"path":"/reference/ds.class.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Class of the R object in the server-side — ds.class","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.class.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Class of the R object in the server-side — ds.class","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Getting the class of the R objects stored in the server-side ds.class(x = \"D\", #whole dataset datasources = connections[1]) #only the first server (\"study1\") is used ds.class(x = \"D$LAB_TSC\", #select a variable datasources = connections[1]) #only the first server (\"study1\") is used # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.colnames.html","id":null,"dir":"Reference","previous_headings":"","what":"Produces column names of the R object in the server-side — ds.colnames","title":"Produces column names of the R object in the server-side — ds.colnames","text":"Retrieves column names R object server-side. function similar R function colnames.","code":""},{"path":"/reference/ds.colnames.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Produces column names of the R object in the server-side — ds.colnames","text":"","code":"ds.colnames(x = NULL, datasources = NULL)"},{"path":"/reference/ds.colnames.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Produces column names of the R object in the server-side — ds.colnames","text":"x character string providing name input data frame matrix. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.colnames.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Produces column names of the R object in the server-side — ds.colnames","text":"ds.colnames returns column names specified server-side data frame matrix.","code":""},{"path":"/reference/ds.colnames.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Produces column names of the R object in the server-side — ds.colnames","text":"input restricted object type data.frame matrix. Server function called: colnamesDS","code":""},{"path":[]},{"path":"/reference/ds.colnames.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Produces column names of the R object in the server-side — ds.colnames","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.colnames.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Produces column names of the R object in the server-side — ds.colnames","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Getting column names of the R objects stored in the server-side ds.colnames(x = \"D\", datasources = connections[1]) #only the first server (\"study1\") is used # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.completeCases.html","id":null,"dir":"Reference","previous_headings":"","what":"Identifies complete cases in server-side R objects — ds.completeCases","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"Selects complete cases data frame, matrix vector contain missing values.","code":""},{"path":"/reference/ds.completeCases.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"","code":"ds.completeCases(x1 = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.completeCases.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"x1 character denoting name input object can data frame, matrix vector. newobj character string provides name complete-cases object stored data servers. user specify name, function generates name generated object name input object suffix \"_complete.cases\" datasources list DSConnection-class objects obtained login. datasources argument specified, default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.completeCases.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"ds.completeCases generates modified data frame, matrix vector rows containing least one NA deleted. output object stored server-side. two validity messages returned client-side indicating name newobj created data source valid form.","code":""},{"path":"/reference/ds.completeCases.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"case data frame matrix, ds.completeCases deletes rows containing one missing values. However ds.completeCases vectors deletes observation recorded NA. Server function called: completeCasesDS","code":""},{"path":"/reference/ds.completeCases.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.completeCases.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Identifies complete cases in server-side R objects — ds.completeCases","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Select complete cases from different R objects ds.completeCases(x1 = \"D\", #data frames in the Opal servers #(see above the connection to the Opal servers) newobj = \"D.completeCases\", # name for the output object # that is stored in the Opal servers datasources = connections) # All Opal servers are used # (see above the connection to the Opal servers) ds.completeCases(x1 = \"D$LAB_TSC\", #vector (variable) of the data frames in the Opal servers #(see above the connection to the Opal servers) newobj = \"LAB_TSC.completeCases\", #name for the output variable #that is stored in the Opal servers datasources = connections[2]) #only the second Opal server is used (\"study2\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.contourPlot.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a contour plot — ds.contourPlot","title":"Generates a contour plot — ds.contourPlot","text":"generates contour plot pooled data one plot dataset client-side.","code":""},{"path":"/reference/ds.contourPlot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a contour plot — ds.contourPlot","text":"","code":"ds.contourPlot( x = NULL, y = NULL, type = \"combine\", show = \"all\", numints = 20, method = \"smallCellsRule\", k = 3, noise = 0.25, datasources = NULL )"},{"path":"/reference/ds.contourPlot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a contour plot — ds.contourPlot","text":"x character string providing name numerical vector. y character string providing name numerical vector. type character string represents type graph display. type set 'combine', combined contour plot displayed type set 'split', contour plotted separately. show character represents plot focus. show set '', ranges variables used plot limits. show set 'zoomed', plot zoomed region actual data . numints number intervals density grid object. method character defines contour created. method set 'smallCellsRule' (default), contour plot actual variables created grids low counts replaced grids zero counts. method set 'deterministic' contour scaled centroids k nearest neighbour original variables created, value k set user. method set 'probabilistic', contour 'noisy' variables generated. k number nearest neighbours centroid calculated. information see details. noise percentage initial variance used variance embedded noise argument method set 'probabilistic'. information see details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.contourPlot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a contour plot — ds.contourPlot","text":"ds.contourPlot returns contour plot client-side.","code":""},{"path":"/reference/ds.contourPlot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a contour plot — ds.contourPlot","text":"ds.contourPlot function first generates density grid uses plot graph. cells grid density matrix hold count less filter set DataSHIELD (usually 5) considered invalid turned 0 avoid potential disclosure. message printed inform user number invalid cells. ranges returned study used process getting grid density matrix exact minimum maximum values rather close approximates real minimum maximum value. done reduce risk potential disclosure. k parameter user can choose value k equal greater pre-specified threshold used disclosure control method lower number observations minus value threshold. k default value 3 (suggest k equal , bigger , 3). Note function fails user uses default value study set bigger threshold. value k used argument method set 'deterministic'. value k ignored argument method set 'probabilistic' 'smallCellsRule'. noise value noise ignored argument method set 'deterministic' 'smallCellsRule'. user can choose value noise equal greater pre-specified threshold 'nfilter.noise'. Default noise value 0.25. added noise follows normal distribution zero mean variance equal percentage initial variance input variable. Server functions called: heatmapPlotDS, rangeDS densityGridDS","code":""},{"path":"/reference/ds.contourPlot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a contour plot — ds.contourPlot","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.contourPlot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates a contour plot — ds.contourPlot","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Generating contour plots ds.contourPlot(x = \"D$LAB_TSC\", y = \"D$LAB_HDL\", type = \"combine\", show = \"all\", numints = 20, method = \"smallCellsRule\", k = 3, noise = 0.25, datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.cor.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates the correlation of R objects in the server-side — ds.cor","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"function calculates correlation two variables correlation matrix variables input data frame.","code":""},{"path":"/reference/ds.cor.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"","code":"ds.cor( x = NULL, y = NULL, type = \"split\", datasources = NULL, classConsistencyCheck = TRUE )"},{"path":"/reference/ds.cor.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"x character string providing name input vector, data frame matrix. y character string providing name input vector, data frame matrix. Default NULL. type character string represents type analysis carry . must set 'split' 'combine'. Default 'split'. information see details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.cor.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"ds.cor returns list containing number missing values variable, number missing variables casewise, correlation matrix, number used complete cases. function applies two disclosure controls. first disclosure control checks number variables bigger percentage individual-level records (allowed percentage pre-specified 'nfilter.glm'). second disclosure control checks none dichotomous level fewer counts pre-specified 'nfilter.tab' threshold.","code":""},{"path":"/reference/ds.cor.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"addition computing correlations; function produces table outlining number complete cases table outlining number missing values allow user decide 'relevance' correlation based number complete cases included correlation calculations. argument y NULL, dimensions object compatible argument x. function calculates pairwise correlations based casewise complete cases means omits rows input data frame include least one cell missing value, calculation correlations. type set 'split' (default), correlation two variables variance-correlation matrix input data frame number complete cases missing values returned every single study. type set 'combine', pooled correlation, total number complete cases total number missing values aggregated involved studies, returned. Server function called: corDS","code":""},{"path":"/reference/ds.cor.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.cor.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculates the correlation of R objects in the server-side — ds.cor","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Get the correlation matrix of two continuous variables ds.cor(x=\"D$LAB_TSC\", y=\"D$LAB_TRIG\", type=\"combine\", datasources = connections) # Example 2: Get the correlation matrix of the variables in a dataframe ds.dataFrame(x=c(\"D$LAB_TSC\", \"D$LAB_TRIG\", \"D$LAB_HDL\", \"D$PM_BMI_CONTINUOUS\"), newobj=\"D.new\", check.names=FALSE, datasources=connections) ds.cor(\"D.new\", type=\"combine\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.corTest.html","id":null,"dir":"Reference","previous_headings":"","what":"Tests for correlation between paired samples in the server-side — ds.corTest","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"similar R stats function cor.test.","code":""},{"path":"/reference/ds.corTest.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"","code":"ds.corTest( x = NULL, y = NULL, method = \"pearson\", exact = NULL, conf.level = 0.95, type = \"split\", datasources = NULL, classConsistencyCheck = FALSE )"},{"path":"/reference/ds.corTest.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"x character string providing name numerical vector. y character string providing name numerical vector. method character string indicating correlation coefficient used test. One \"pearson\", \"kendall\", \"spearman\", can abbreviated. Default set \"pearson\". exact logical indicating whether exact p-value computed. Used Kendall's tau Spearman's rho. See Details R stats function cor.test meaning NULL (default). conf.level confidence level returned confidence interval. Currently used Pearson product moment correlation coefficient least 4 complete pairs observations. Default set 0.95. type character string represents type analysis carry . must set 'split' 'combine'. Default set 'split'. type set \"combine\" approximated pooled correlation estimated based Fisher's z transformation. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default FALSE.","code":""},{"path":"/reference/ds.corTest.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"ds.corTest returns client-side results correlation test.","code":""},{"path":"/reference/ds.corTest.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"Runs two-sided correlation test paired samples, using one Pearson's product moment correlation coefficient, Kendall's tau Spearman's rho. Server function called: corTestDS","code":""},{"path":"/reference/ds.corTest.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.corTest.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tests for correlation between paired samples in the server-side — ds.corTest","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # test for correlation ds.corTest(x = \"D$LAB_TSC\", y = \"D$LAB_HDL\", datasources = connections[1]) #Only first server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.cov.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates the covariance of R objects in the server-side — ds.cov","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"function calculates covariance two variables variance-covariance matrix variables input data frame.","code":""},{"path":"/reference/ds.cov.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"","code":"ds.cov( x = NULL, y = NULL, naAction = \"pairwise.complete\", type = \"split\", datasources = NULL, classConsistencyCheck = TRUE )"},{"path":"/reference/ds.cov.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"x character string providing name input vector, data frame matrix. y character string providing name input vector, data frame matrix. Default NULL. naAction character string giving method computing covariances presence missing values. must set 'casewise.complete' 'pairwise.complete'. Default 'pairwise.complete'. information see details. type character string represents type analysis carry . must set 'split' 'combine'. Default 'split'. information see details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.cov.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"ds.cov returns list containing number missing values variable, number missing values casewise pairwise depending argument naAction, covariance matrix, number used complete cases error message indicates whether input variables pass disclosure controls. first disclosure control checks number variables bigger percentage individual-level records (allowed percentage pre-specified 'nfilter.glm'). second disclosure control checks none dichotomous level fewer counts pre-specified 'nfilter.tab' threshold. input variables pass disclosure controls output values replaced NAs. variables valid pass controls, output matrices returned also error message returned replaced NA.","code":""},{"path":"/reference/ds.cov.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"addition computing covariances; function produces table outlining number complete cases table outlining number missing values allow user decide 'relevance' covariance based number complete cases included covariance calculations. argument y NULL, dimensions object compatible argument x. naAction set 'casewise.complete', function omits rows whole data frame include least one cell missing value calculation covariances. naAction set 'pairwise.complete' (default), function divides input data frame subset data frames formed pair two variables (combinations considered) omits rows missing values pair separately calculates covariances pairs. type set 'split' (default), covariance two variables variance-covariance matrix input data frame number complete cases missing values returned every single study. type set 'combine', pooled covariance, total number complete cases total number missing values aggregated involved studies, returned. Server function called: covDS","code":""},{"path":"/reference/ds.cov.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.cov.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculates the covariance of R objects in the server-side — ds.cov","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Calculate the covariance between two vectors ds.assign(newobj='labhdl', toAssign='D$LAB_HDL', datasources = connections) ds.assign(newobj='labtsc', toAssign='D$LAB_TSC', datasources = connections) ds.assign(newobj='gender', toAssign='D$GENDER', datasources = connections) ds.cov(x = 'labhdl', y = 'labtsc', naAction = 'pairwise.complete', type = 'combine', datasources = connections) ds.cov(x = 'labhdl', y = 'gender', naAction = 'pairwise.complete', type = 'combine', datasources = connections[1]) #only the first Opal server is used (\"study1\") # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.dataFrame.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a data frame object in the server-side — ds.dataFrame","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"Creates data frame elemental components: pre-existing data frames, single variables matrices.","code":""},{"path":"/reference/ds.dataFrame.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"","code":"ds.dataFrame( x = NULL, row.names = NULL, check.rows = FALSE, check.names = TRUE, stringsAsFactors = TRUE, completeCases = FALSE, DataSHIELD.checks = FALSE, newobj = NULL, datasources = NULL, notify.of.progress = FALSE )"},{"path":"/reference/ds.dataFrame.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"x character string provides name objects combined. row.names NULL, integer character string provides row names output data frame. check.rows logical. TRUE rows checked consistency length names. Default FALSE. check.names logical. TRUE column names data frame checked ensure unique. Default TRUE. stringsAsFactors logical. true character vectors converted factors. Default TRUE. completeCases logical. TRUE rows one missing values deleted output data frame. Default FALSE. DataSHIELD.checks logical. Default FALSE. TRUE undertakes DataSHIELD checks (time-consuming) : 1. input object(s) () defined studies 2. input object(s) () legal class studies 3. duplicated column names input objects study 4. number rows data frames matrices length component variables newobj character string provides name output data frame stored data servers. Default dataframe.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. notify..progress specifies console output produced indicate progress. Default FALSE.","code":""},{"path":"/reference/ds.dataFrame.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"ds.dataFrame returns object specified newobj argument written serverside. Also, two validity messages returned client-side indicating name newobj created data source valid form.","code":""},{"path":"/reference/ds.dataFrame.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"creates data frame combining pre-existing data frames, matrices variables. length component variables number rows data frames matrices must . output data frame number rows. Server functions called: classDS, colnamesDS, dataFrameDS","code":""},{"path":"/reference/ds.dataFrame.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.dataFrame.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates a data frame object in the server-side — ds.dataFrame","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Create a new data frame ds.dataFrame(x = c(\"D$LAB_TSC\",\"D$GENDER\",\"D$PM_BMI_CATEGORICAL\"), row.names = NULL, check.rows = FALSE, check.names = TRUE, stringsAsFactors = TRUE, #character variables are converted to a factor completeCases = TRUE, #only rows with not missing values are selected DataSHIELD.checks = FALSE, newobj = \"df1\", datasources = connections[1], #only the first Opal server is used (\"study1\") notify.of.progress = FALSE) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.dataFrameFill.html","id":null,"dir":"Reference","previous_headings":"","what":"Creates missing values columns in the server-side — ds.dataFrameFill","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"Adds extra columns missing values data frame server-side.","code":""},{"path":"/reference/ds.dataFrameFill.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"","code":"ds.dataFrameFill(df.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.dataFrameFill.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"df.name character string representing name input data frame filled extra columns missing values. newobj character string provides name output data frame stored data servers. Default value \"dataframefill.newobj\". datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.dataFrameFill.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"ds.dataFrameFill returns object specified newobj argument written server-side. Also, two validity messages returned client-side indicating name newobj created data source valid form.","code":""},{"path":"/reference/ds.dataFrameFill.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"function checks input data frames variables (.e. column names) used studies. study variables, function generates variables vectors missing values combines columns input data frame. generated variables class factor, function assigns corresponding levels factors given studies factors exist. Server function called: dataFrameFillDS","code":""},{"path":"/reference/ds.dataFrameFill.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"Demetris Avraam DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.dataFrameFill.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Creates missing values columns in the server-side — ds.dataFrameFill","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Create two data frames with one different column ds.dataFrame(x = c(\"D$LAB_TSC\",\"D$LAB_TRIG\",\"D$LAB_HDL\", \"D$LAB_GLUC_ADJUSTED\",\"D$PM_BMI_CONTINUOUS\"), newobj = \"df1\", datasources = connections[1]) ds.dataFrame(x = c(\"D$LAB_TSC\",\"D$LAB_TRIG\",\"D$LAB_HDL\",\"D$LAB_GLUC_ADJUSTED\"), newobj = \"df1\", datasources = connections[2]) # Fill the data frame with NA columns ds.dataFrameFill(df.name = \"df1\", newobj = \"D.Fill\", datasources = connections[c(1,2)]) # Two servers are used # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.dataFrameSort.html","id":null,"dir":"Reference","previous_headings":"","what":"Sorts data frames in the server-side — ds.dataFrameSort","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"Sorts data frame using specified sort key.","code":""},{"path":"/reference/ds.dataFrameSort.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"","code":"ds.dataFrameSort( df.name = NULL, sort.key.name = NULL, sort.descending = FALSE, sort.method = \"default\", newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.dataFrameSort.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"df.name character string providing name data frame sorted. sort.key.name character string providing name sort key. sort.descending logical, TRUE data frame sorted. sort key descending order. Default = FALSE (sort order ascending). sort.method character string specifies method used sort data frame. can set \"alphabetic\",\"\" \"numeric\", \"n\". newobj character string provides name output data frame stored data servers. Default dataframesort.newobj. df.name first argument ds.dataFrameSort(). datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.dataFrameSort.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"ds.dataFrameSort returns sorted data frame written server-side. Also, two validity messages returned client-side indicating name newobj created data source valid form.","code":""},{"path":"/reference/ds.dataFrameSort.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"sorts specified data.frame serverside using sort key also server-side. sort key can either sit data.frame outside . sort key can forced interpreted alphabetic numeric. numeric vector sorted alphabetically, order can look confusing. example, numeric vector sort: vector.2.sort = c(-192, 76, 841, NA, 1670, 163, 147, 101, -112, -231, -9, 119, 112, NA) sorting numbers ascending (default) manner, largest negative numbers get ordered first leading largest positive numbers finally (default R) NAs positioned end vector: numeric.sort = c(-231, -192, -112, -9, 76, 101, 112, 119, 147, 163, 841, 1670, NA, NA) Instead, vector sorted alphabetically resultant vector : alphabetic.sort = (-112, -192, -231, -9, 101, 112, 119, 147, 163, 1670, 76, 841, NA, NA) Server function called: dataFrameSortDS.","code":""},{"path":"/reference/ds.dataFrameSort.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.dataFrameSort.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sorts data frames in the server-side — ds.dataFrameSort","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Sorting the data frame ds.dataFrameSort(df.name = \"D\", sort.key.name = \"D$LAB_TSC\", sort.descending = TRUE, sort.method = \"numeric\", newobj = \"df.sort\", datasources = connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.dataFrameSubset.html","id":null,"dir":"Reference","previous_headings":"","what":"Sub-sets data frames in the server-side — ds.dataFrameSubset","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"Subsets data frame rows /columns.","code":""},{"path":"/reference/ds.dataFrameSubset.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"","code":"ds.dataFrameSubset( df.name = NULL, V1.name = NULL, V2.name = NULL, Boolean.operator = NULL, keep.cols = NULL, rm.cols = NULL, keep.NAs = NULL, newobj = NULL, datasources = NULL, notify.of.progress = FALSE )"},{"path":"/reference/ds.dataFrameSubset.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"df.name character string providing name data frame subset. V1.name character string specifying name vector Boolean operator applied define subset. information see details. V2.name character string specifying name vector compare V1.name. Boolean.operator character string specifying one six possible Boolean operators: '==', '!=', '>', '>=', '<' '<='. keep.cols numeric vector specifying numbers columns kept final subset. rm.cols numeric vector specifying numbers columns removed final subset. keep.NAs logical, TRUE missing values included subset. FALSE NULL rows least one missing values removed subset. newobj character string provides name output object stored data servers. Default dataframesubset.newobj. datasources list DSConnection-class objects obtained login. datasources default set connections used: see datashield.connections_default. notify..progress specifies console output produced indicate progress. Default FALSE.","code":""},{"path":"/reference/ds.dataFrameSubset.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"ds.dataFrameSubset returns object specified newobj argument written server-side. Also, two validity messages returned client-side indicating name newobj created data source valid form.","code":""},{"path":"/reference/ds.dataFrameSubset.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"Subset pre-existing data frame using standard set Boolean operators (==, !=, >, >=, <, <=). subsetting made rows, also possible select columns keep remove. Instead, wish keep rows subset (e.g. primary plan subset columns rows) V1.name V2.name parameters can used specify vector length data frame subsetted study every element 1 missing values. information see example 2 . Server functions called: dataFrameSubsetDS1 dataFrameSubsetDS2","code":""},{"path":"/reference/ds.dataFrameSubset.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.dataFrameSubset.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sub-sets data frames in the server-side — ds.dataFrameSubset","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Subsetting a data frame #Example 1: Include some rows and all columns in the subset ds.dataFrameSubset(df.name = \"D\", V1.name = \"D$LAB_TSC\", V2.name = \"D$LAB_TRIG\", Boolean.operator = \">\", keep.cols = NULL, #All columns are included in the new subset rm.cols = NULL, #All columns are included in the new subset keep.NAs = FALSE, #All rows with NAs are removed newobj = \"new.subset\", datasources = connections[1],#only the first server is used (\"study1\") notify.of.progress = FALSE) #Example 2: Include all rows and some columns in the new subset #Select complete cases (rows without NA) ds.completeCases(x1 = \"D\", newobj = \"complet\", datasources = connections) #Create a vector with all ones ds.make(toAssign = \"complet$LAB_TSC-complet$LAB_TSC+1\", newobj = \"ONES\", datasources = connections) #Subset the data ds.dataFrameSubset(df.name = \"complet\", V1.name = \"ONES\", V2.name = \"ONES\", Boolean.operator = \"==\", keep.cols = c(1:4,10), #only columns 1, 2, 3, 4 and 10 are selected rm.cols = NULL, keep.NAs = FALSE, newobj = \"subset.all.rows\", datasources = connections, #all servers are used notify.of.progress = FALSE) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.densityGrid.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a density grid in the client-side — ds.densityGrid","title":"Generates a density grid in the client-side — ds.densityGrid","text":"function generates grid density object can used produced heatmap contour plots.","code":""},{"path":"/reference/ds.densityGrid.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a density grid in the client-side — ds.densityGrid","text":"","code":"ds.densityGrid( x = NULL, y = NULL, numints = 20, type = \"combine\", datasources = NULL )"},{"path":"/reference/ds.densityGrid.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a density grid in the client-side — ds.densityGrid","text":"x character string providing name input numerical vector. y character string providing name input numerical vector. numints integer, number intervals grid density object. default value 20. type character string represents type graph display. type set 'combine', pooled grid density matrix generated, instead type set 'split' one grid density matrix generated. Default 'combine'. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.densityGrid.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a density grid in the client-side — ds.densityGrid","text":"ds.densityGrid returns grid density matrix.","code":""},{"path":"/reference/ds.densityGrid.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a density grid in the client-side — ds.densityGrid","text":"cells count > 0 < nfilter.tab considered invalid count set 0. DataSHIELD user access micro-data extreme values maximum minimum potentially non-disclosive function allow user set limits density grid minimum maximum values x y vectors. elements set server-side function densityGridDS 'valid' values (.e. values lead leakage micro-data user). Server function called: densityGridDS","code":""},{"path":"/reference/ds.densityGrid.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a density grid in the client-side — ds.densityGrid","text":"DataSHIELD Development Team","code":""},{"path":[]},{"path":"/reference/ds.dim.html","id":null,"dir":"Reference","previous_headings":"","what":"Retrieves the dimension of a server-side R object — ds.dim","title":"Retrieves the dimension of a server-side R object — ds.dim","text":"Gives dimensions R object server-side. function similar R function dim.","code":""},{"path":"/reference/ds.dim.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Retrieves the dimension of a server-side R object — ds.dim","text":"","code":"ds.dim( x = NULL, type = \"both\", datasources = NULL, classConsistencyCheck = TRUE )"},{"path":"/reference/ds.dim.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Retrieves the dimension of a server-side R object — ds.dim","text":"x character string providing name input object. type character string represents type analysis carry . type set 'combine', 'combined', 'combines' 'c', global dimension returned. type set 'split', 'splits' 's', dimension returned separately study. type set '' 'b', sets outputs produced. Default ''. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.dim.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Retrieves the dimension of a server-side R object — ds.dim","text":"ds.dim retrieves client-side dimension object form vector first element indicates number rows second element indicates number columns.","code":""},{"path":"/reference/ds.dim.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Retrieves the dimension of a server-side R object — ds.dim","text":"function returns dimension server-side input object (e.g. array, matrix data frame) every single study pooled dimension object summing individual dimensions returned study. Server function called: dimDS","code":""},{"path":[]},{"path":"/reference/ds.dim.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Retrieves the dimension of a server-side R object — ds.dim","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":[]},{"path":"/reference/ds.dmtC2S.html","id":null,"dir":"Reference","previous_headings":"","what":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","title":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","text":"Creates data.frame, matrix tibble serverside equivalent data.frame, matrix tibble (DMT) clientside.","code":""},{"path":"/reference/ds.dmtC2S.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","text":"","code":"ds.dmtC2S(dfdata = NA, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.dmtC2S.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","text":"dfdata character string specifies name DMT copied clientside serverside newobj character string specifying name DMT serverside output written. argument specified NULL name copied DMT defaults \"dmt.copied.C2S\". datasources specifies particular 'connection object(s)' use. e.g. several data sets sources working called opals., opals.w2, connection.xyz, can choose work . call 'datashield.connections_find()' lists different datasets available one called 'default.connections' dataset used default dataset specified. wish change connections wish use default call datashield.connections_default('opals.') set 'default.connections' 'opals.' absence specific instructions contrary (e.g. specifying particular dataset used via argument) subsequent function calls datasets held opals.. argument specified, set without inverted commas: e.g. datasources=opals.datasources=default.connections. argument also allows apply function solely subset studies/sources working . example, second source set three, can specified using call datasources=connection.xyz[2]. hand, wish specify solely first third sources, appropriate call datasources=connections.xyz[c(1,3)]","code":""},{"path":"/reference/ds.dmtC2S.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","text":"object specified argument (default name \"dmt.copied.C2S\") written data.frame/matrix/tibble serverside.","code":""},{"path":"/reference/ds.dmtC2S.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","text":"ds.dmtC2S calls assign function dmtC2SDS. keep function simple (though less flexible), number parameters specifying DMT generated serverside fixed characteristics DMT copied rather explicitly specifying selected arguments. consequence, removed list arguments instead given invariant values first lines code. include: =\"clientside.dmt\", nrows.scalar=NULL, ncols.scalar=NULL, byrow = FALSE. specific value \"clientside.dmt\" argument <> simply means required information generated characteristics clientside DMT. fixed empirically number rows columns DMT copied. specifies writing serverside DMT columns rows defaulted byrow=FALSE .e. \"column\".","code":""},{"path":"/reference/ds.dmtC2S.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Copy a clientside data.frame, matrix or tibble to the serverside — ds.dmtC2S","text":"Paul Burton DataSHIELD Development Team - 3rd June, 2021","code":""},{"path":"/reference/ds.elspline.html","id":null,"dir":"Reference","previous_headings":"","what":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","text":"function based native R function elspline lspline package. function computes basis piecewise-linear spline , depending argument marginal, coefficients can interpreted (1) slopes consecutive spline segments, (2) slope change consecutive knots.","code":""},{"path":"/reference/ds.elspline.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","text":"","code":"ds.elspline( x, n, marginal = FALSE, names = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.elspline.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","text":"x name input numeric variable n integer greater 2, knots computed cut n equally-spaced intervals along range x marginal logical, parametrise spline, see Details names character, vector names constructed variables newobj character string provides name output variable stored data servers. Default elspline.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.elspline.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","text":"object class \"lspline\" \"matrix\", name specified newobj argument (default name \"elspline.newobj\"), assigned serverside.","code":""},{"path":"/reference/ds.elspline.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","text":"marginal FALSE (default) coefficients spline correspond slopes consecutive segments. TRUE first coefficient correspond slope first segment. consecutive coefficients correspond change slope compared previous segment. Function elspline wraps lspline computes knot positions cut range x n equal-width intervals.","code":""},{"path":"/reference/ds.elspline.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.elspline","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.exists.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks if an object is defined on the server-side — ds.exists","title":"Checks if an object is defined on the server-side — ds.exists","text":"Looks R object given name defined server-side. function similar R function exists.","code":""},{"path":"/reference/ds.exists.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks if an object is defined on the server-side — ds.exists","text":"","code":"ds.exists(x = NULL, datasources = NULL)"},{"path":"/reference/ds.exists.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks if an object is defined on the server-side — ds.exists","text":"x character string providing name object look . datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.exists.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks if an object is defined on the server-side — ds.exists","text":"ds.exists returns logical object. TRUE object server-side FALSE otherwise.","code":""},{"path":"/reference/ds.exists.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks if an object is defined on the server-side — ds.exists","text":"DataSHIELD possible see data servers collaborating studies. possible get summaries objects stored server-side. however important know object defined (.e. exists) server-side. function checks object exist server-side. Server function called: exists","code":""},{"path":[]},{"path":"/reference/ds.exists.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Checks if an object is defined on the server-side — ds.exists","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.exists.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Checks if an object is defined on the server-side — ds.exists","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Check if the object exist in the server-side ds.exists(x = \"D\", datasources = connections) #All opal servers are used ds.exists(x = \"D\", datasources = connections[1]) #Only the first Opal server is used (study1) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.exp.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the exponentials in the server-side — ds.exp","title":"Computes the exponentials in the server-side — ds.exp","text":"Computes exponential values specified numeric vector. function similar R function exp.","code":""},{"path":"/reference/ds.exp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the exponentials in the server-side — ds.exp","text":"","code":"ds.exp(x = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.exp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the exponentials in the server-side — ds.exp","text":"x character string providing name numerical vector. newobj character string provides name output variable stored data servers. Default exp.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.exp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the exponentials in the server-side — ds.exp","text":"ds.exp returns vector study exponential values numeric vector specified argument x. created vectors stored server-side.","code":""},{"path":"/reference/ds.exp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the exponentials in the server-side — ds.exp","text":"Server function called: expDS.","code":""},{"path":"/reference/ds.exp.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the exponentials in the server-side — ds.exp","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.exp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the exponentials in the server-side — ds.exp","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # compute exponential function of the 'PM_BMI_CONTINUOUS' variable ds.exp(x = \"D$PM_BMI_CONTINUOUS\", newobj = \"exp.PM_BMI_CONTINUOUS\", datasources = connections[1]) #only the first Opal server is used (study1) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.extractQuantiles.html","id":null,"dir":"Reference","previous_headings":"","what":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","title":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","text":"Takes global ranks quantiles held serverside data data frame written ranksSecureDS4 named specified argument () converts values series quantile values identify, example, value V2BR across studies corresponds median 95 indication study V2BR corresponding particular quantile falls , fact, relevant value may fall one study may appear multiple times one study. Finally, output data frame containing information written clientside serverside study separately.","code":""},{"path":"/reference/ds.extractQuantiles.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","text":"","code":"ds.extractQuantiles( extract.quantiles, extract.summary.output.ranks.df, extract.ranks.sort.by, extract.rm.residual.objects, extract.datasources = NULL )"},{"path":"/reference/ds.extractQuantiles.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","text":"extract.quantiles one restricted set character strings. value argument set choosing value argument ds.ranksSecure. summary: mitigate disclosure risk following set quantiles can generated: c(0.025,0.05,0.10,0.20,0.25,0.30,0.3333,0.40,0.50,0.60,0.6667, 0.70,0.75,0.80,0.90,0.95,0.975). allowable formats argument general form: \"0.025-0.975\" first number lowest quantile estimated second number equivalent highest quantile estimate. two quantiles estimated along allowable quantiles . allowable argument values : \"0.025-0.975\", \"0.05-0.95\", \"0.10-0.90\", \"0.20-0.80\". Two alternative values \"quartiles\" .e. c(0.25,0.50,0.75), \"median\" .e. c(0.50). default value \"0.05-0.95\". details, see associated document \"secure.global.ranking.docx\". Also see header file ds.ranksSecure. extract.summary.output.ranks.df character string specifies optional name summary data.frame written serverside data source contains 5 key output variables ranking procedure pertaining particular data source. name specified argument ds.ranksSecure, default name allocated \"summary.ranks.df\".reason argument needs specifying ds.extractQuantiles , ds.extractQuantiles last function called ds.ranksSecure almost final command ds.extractQuantiles print name data frame containing summarised ranking information generated ds.ranksSecure order data frame laid . therefore appears last output produced ds.ranksSecure run, happens clear relates main output ds.ranksSecure ds.extractQuantiles. extract.ranks.sort.character string taking two possible values. \"ID.orig\" \"vals.orig\". set via argument ds.ranksSecure. details see associated document entitled \"secure.global.ranking.docx\". Also see header file ds.ranksSecure. extract.rm.residual.objects logical value. Default = TRUE: beginning end run ds.ranksSecure delete extraneous objects otherwise left behind. usually needed, value one investigating problem ranking. FALSE: delete residual objects extract.datasources specifies particular opal object(s) use. set via argument ds.ranksSecure. details see associated document entitled \"secure.global.ranking.docx\". Also see header file ds.ranksSecure.","code":""},{"path":"/reference/ds.extractQuantiles.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","text":"final main output ds.extractQuantiles data frame object named \"final.quantile.df\". contains two vectors. first named \"evaluation.quantiles\" lists full set quantiles requested evaluation specified argument \"quantiles..estimation\" ds.ranksSecure explained detail information argument \"extract.quantiles\" function. second vector called \"final.quantile.vector\" details values V2BR correspond evaluation quantiles vector 1. information data frame \"final.quantile.df\" generic: information identifying study value V2BR falls. data frame written clientside (non-disclosive) also copied serverside every study. means easily accessible anywhere DataSHIELD environment. details see associated document entitled \"secure.global.ranking.docx\".","code":""},{"path":"/reference/ds.extractQuantiles.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","text":"ds.extractQuantiles clientside function usually called within clientside function ds.ranksSecure.try call ds.extractQuantiles directly(.e. running ds.ranksSecure) almost certainly going set quite vectors scalars normally set ds.ranksSecure likely difficult. ds.extractQuantiles calls two serverside functions extractQuantilesDS1 extractQuantilesDS2. details cluster functions collectively enable secure global ranking estimation global quantiles see associated document entitled \"secure.global.ranking.docx\". particular explains ds.extractQuantiles works. Also see header file ds.ranksSecure.","code":""},{"path":"/reference/ds.extractQuantiles.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Secure ranking of a vector across all sources and use of these ranks to estimate global quantiles across all studies — ds.extractQuantiles","text":"Paul Burton 11th November, 2021","code":""},{"path":"/reference/ds.forestplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Forestplot for SLMA models — ds.forestplot","title":"Forestplot for SLMA models — ds.forestplot","text":"Draws forestplot coefficients Study-Level Meta-Analysis performed DataSHIELD","code":""},{"path":"/reference/ds.forestplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Forestplot for SLMA models — ds.forestplot","text":"","code":"ds.forestplot(mod, variable = NULL, method = \"ML\", layout = \"JAMA\")"},{"path":"/reference/ds.forestplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Forestplot for SLMA models — ds.forestplot","text":"mod list List outputted SLMA models DataSHIELD (ds.glmerSLMA, ds.glmSLMA, ds.lmerSLMA) variable character (default NULL) Variable meta-analyse visualise, setting argument NULL (default) first independent variable used. method character (Default \"ML\") Method estimate study variance. See details ?meta::metagen different options. layout character (default \"JAMA\") Layout plot. See details ?meta::metagen different options.","code":""},{"path":"/reference/ds.forestplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Forestplot for SLMA models — ds.forestplot","text":"Results foresplot object created `meta::forest`.","code":""},{"path":"/reference/ds.forestplot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Forestplot for SLMA models — ds.forestplot","text":"","code":"if (FALSE) { # \\dontrun{ # Run a logistic regression builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Fit the logistic regression model mod <- ds.glmSLMA(formula = \"DIS_DIAB~GENDER+PM_BMI_CONTINUOUS+LAB_HDL\", data = \"D\", family = \"binomial\", datasources = connections) # Plot the results of the model ds.forestplot(mod) } # }"},{"path":"/reference/ds.gamlss.html","id":null,"dir":"Reference","previous_headings":"","what":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","title":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","text":"function calls gamlssDS wrapper function gamlss R package. function returns object class \"gamlss\", generalized additive model location, scale shape (GAMLSS). function also saves residuals object server-side name specified newobj argument. addition, argument centiles set TRUE, function calls centiles function gamlss package returns sample percentages centile curve.","code":""},{"path":"/reference/ds.gamlss.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","text":"","code":"ds.gamlss( formula = NULL, sigma.formula = \"~1\", nu.formula = \"~1\", tau.formula = \"~1\", family = \"NO()\", data = NULL, method = \"RS\", mu.fix = FALSE, sigma.fix = FALSE, nu.fix = FALSE, tau.fix = FALSE, control = c(0.001, 20, 1, 1, 1, 1, Inf), i.control = c(0.001, 50, 30, 0.001), centiles = FALSE, xvar = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.gamlss.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","text":"formula formula object, response left ~ operator, terms, separated + operators, right. Nonparametric smoothing terms indicated pb() penalised beta splines, cs smoothing splines, lo loess smooth terms random ra random terms, e.g. 'y~cs(x,df=5)+x1+x2*x3'. sigma.formula formula object fitting model sigma parameter, formula , e.g. sigma.formula='~cs(x,df=5)'. nu.formula formula object fitting model nu parameter, e.g. nu.formula='~x'. tau.formula formula object fitting model tau parameter, e.g. tau.formula='~cs(x,df=2)'. family gamlss.family object, used define distribution link functions various parameters. distribution families supported gamlss() can found gamlss.family. Functions 'BI()' (binomial) produce family object. Also can given without parentheses .e. 'BI'. Family functions can take arguments, 'BI(mu.link=probit)'. data data frame containing variables occurring formula. missing, variables parent environment. method character indicating algorithm GAMLSS. Can either 'RS', 'CG' 'mixed'. method='RS' function use Rigby Stasinopoulos algorithm, method='CG' function use Cole Green algorithm, method='mixed' function use RS algorithm twice switching Cole Green algorithm 10 extra iterations. mu.fix logical, indicate whether mu parameter kept fixed fitting processes. sigma.fix logical, indicate whether sigma parameter kept fixed fitting processes. nu.fix logical, indicate whether nu parameter kept fixed fitting processes. tau.fix logical, indicate whether tau parameter kept fixed fitting processes. control sets control parameters outer iterations algorithm using gamlss.control function. vector 7 numeric values: () c.crit (convergence criterion algorithm), (ii) n.cyc (number cycles algorithm), (iii) mu.step (step length parameter mu), (iv) sigma.step (step length parameter sigma), (v) nu.step (step length parameter nu), (vi) tau.step (step length parameter tau), (vii) gd.tol (global deviance tolerance level). default values 7 parameters set c(0.001, 20, 1, 1, 1, 1, Inf). .control sets control parameters inner iterations RS algorithm using glim.control function. vector 4 numeric values: () cc (convergence criterion algorithm), (ii) cyc (number cycles algorithm), (iii) bf.cyc (number cycles backfitting algorithm), (iv) bf.tol (convergence criterion (tolerance level) backfitting algorithm). default values 4 parameters set c(0.001, 50, 30, 0.001). centiles logical, indicating whether function centiles() used tabulate sample percentages centile curve. Default set FALSE. xvar unique explanatory variable used centiles() function. variable used centiles argument set TRUE. restriction centiles function applies models one explanatory variable . newobj character string provides name output object stored data servers. Default gamlss_res. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.gamlss.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","text":"gamlss object components native R gamlss function. Individual-level information like components y (response response) residuals (normalised quantile residuals model) disclosed client-side.","code":""},{"path":"/reference/ds.gamlss.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","text":"additional details see help header gamlss centiles functions native R gamlss package.","code":""},{"path":"/reference/ds.gamlss.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generalized Additive Models for Location Scale and Shape — ds.gamlss","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.getWGSR.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"Calculate Growth Reference z-score given anthropometric measurement function similar R function getWGSR zscorer package.","code":""},{"path":"/reference/ds.getWGSR.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"","code":"ds.getWGSR( sex = NULL, firstPart = NULL, secondPart = NULL, index = NULL, standing = NA, thirdPart = NA, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.getWGSR.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"sex name binary variable indicates sex subject. must coded 1 = male 2 = female. project variable sex different levels, recode levels 1 males 2 females using ds.recodeValues DataSHIELD function use ds.getWGSR. firstPart Name variable specifying: Weight (kg) BMI/, W/, W/H, W/L Head circumference (cm) HC/Height (cm) H/Length (cm) L/MUAC (cm) MUAC/Sub-scapular skinfold (mm) SSF/Triceps skinfold (mm) TSF/Give quoted variable name (e.g.) \"weight\". careful units (weight kg; height, length, head circumference, MUAC cm; skinfolds mm). secondPart Name variable specifying: Age (days) H/, HC/, L/, MUAC/, SSF/, TSF/Height (cm) BMI/, W/H Length (cm) W/L Give quoted variable name (e.g.) \"age\". careful units (age days; height length cm). index index calculated added data. One : bfa BMI age hca Head circumference age hfa Height age lfa Length age mfa MUAC age ssa Sub-scapular skinfold age tsa Triceps skinfold age wfa Weight age wfh Weight height wfl Weight length Give quoted index name (e.g.) \"wfh\". standing Variable specifying stature measured. NA (default) age (\"hfa\" \"lfa\") height rules (\"wfh\" \"wfl\") applied. must coded 1 = Standing; 2 = Supine; 3 = Unknown. Missing values recoded 3 = Unknown. Give single value (e.g.\"1\"). value specified height age rules applied. thirdPart Name variable specifying age (days) BMI/. Give quoted variable name (e.g.) \"age\". careful units (age days). age given different units convert age days using ds.make DataSHIELD function use ds.getWGSR. example age given months transformation given formula $age_days=age_months*(365.25/12)$. newobj character string provides name output variable stored data servers. Defaults getWGSR.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.getWGSR.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"ds.getWGSR assigns vector study includes z-scores specified index. created vectors stored servers.","code":""},{"path":"/reference/ds.getWGSR.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"function calls server-side function getWGSRDS computes Growth Reference z-scores anthropometric data weight, height length, MUAC (middle upper arm circumference), head circumference, sub-scapular skinfold triceps skinfold. Note function might fail return NAs variables outside ranges given WGS (Child Growth Standards) reference (.e. 45 120 cm height 0 60 months age). user check ranges units data.","code":""},{"path":"/reference/ds.getWGSR.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.getWGSR.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the WHO Growth Reference z-scores of anthropometric data — ds.getWGSR","text":"","code":"if (FALSE) { # \\dontrun{ # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"ANTHRO.anthro1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"ANTHRO.anthro2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"ANTHRO.anthro3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Generate the weight-for-height (wfh) index ds.getWGSR(sex = \"D$sex\", firstPart = \"D$weight\", secondPart = \"D$height\", index = \"wfh\", newobj = \"wfh_index\", datasources = connections) # Example 2: Generate the BMI for age (bfa) index ds.getWGSR(sex = \"D$sex\", firstPart = \"D$weight\", secondPart = \"D$height\", index = \"bfa\", thirdPart = \"D$age\", newobj = \"bfa_index\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.glm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fits Generalized Linear Model — ds.glm","title":"Fits Generalized Linear Model — ds.glm","text":"Fits Generalized Linear Model (GLM) data single multiple sources server-side.","code":""},{"path":"/reference/ds.glm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fits Generalized Linear Model — ds.glm","text":"","code":"ds.glm( formula = NULL, data = NULL, family = NULL, offset = NULL, weights = NULL, checks = FALSE, maxit = 20, CI = 0.95, viewIter = FALSE, viewVarCov = FALSE, viewCor = FALSE, datasources = NULL )"},{"path":"/reference/ds.glm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fits Generalized Linear Model — ds.glm","text":"formula object class formula describing model fitted. information see Details. data character string specifying name (optional) data frame contains variables GLM formula. family identifies error distribution function use model. can set \"gaussian\", \"binomial\" \"poisson\". information see Details. offset character string specifying name variable used offset. ds.glm allow offset vector written directly GLM formula. information see Details. weights character string specifying name variable containing prior regression weights fitting process. ds.glm allow weights vector written directly GLM formula. checks logical. TRUE ds.glm checks structural integrity model. Default FALSE. information see Details. maxit numeric scalar denoting maximum number iterations permitted ds.glm declares model failed converge. CI numeric value specifying confidence interval. Default 0.95. viewIter logical. TRUE results intermediate iterations printed. FALSE final results shown. Default FALSE. viewVarCov logical. TRUE variance-covariance matrix parameter estimates returned. Default FALSE. viewCor logical. TRUE correlation matrix parameter estimates returned. Default FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.glm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fits Generalized Linear Model — ds.glm","text":"Many elements output list returned ds.glm equivalent returned glm() function native R. However, potentially disclosive elements individual-level residuals linear predictor values blocked. case, non-disclosive elements returned study separately. list elements returned ds.glm mentioned : Nvalid: total number valid observational units across studies. Nmissing: total number observational units across studies least one data item missing. Ntotal: total observational units across studies, sum valid missing units. disclosure.risk: risk disclosure, value 1 indicates one disclosure traps triggered study. errorMessage: explanation errors disclosure risks identified. nsubs: total number observational units used ds.glm function. nb usually nvalid. iter: total number iterations convergence achieved. family: error family link function. formula: model formula, see description formula input parameter (). coefficients: matrix 5 columns: First : names regression parameters (coefficients) model second : estimated values third : corresponding standard errors estimated values fourth : ratio estimate/standard error fifth : p-value treating standardised normal deviate dev: residual deviance. df: residual degrees freedom. nb residual degrees freedom + number parameters model = nsubs. output.information: reminder user information top output. Also, estimated coefficients standard errors expanded estimated confidence intervals % coverage specified ci argument returned. poisson model, output generated scale linear predictor (log rates log rate ratios) natural scale exponentiation (rates rate ratios).","code":""},{"path":"/reference/ds.glm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fits Generalized Linear Model — ds.glm","text":"Fits GLM data single source multiple sources server-side. latter case, data co-analysed (using ds.glm) using approach mathematically equivalent placing individual-level data sources one central warehouse analysing data using conventional glm() function R. situation marked heterogeneity sources corrected (possible) fixed effects. example, study (binary) logistic regression analysis independent intercept, equivalent allowing study different baseline risk disease. may also viewed IP (individual person) meta-analysis fixed effects. formula shortcut notation formulas allowed R's standard glm() function also allowed ds.glm. Many GLMs can fitted simply using formula : \\(y~+b+c+d\\) simply means fit GLM y outcome variable , b, c d covariates. default models also include intercept (regression constant) term. Instead, need fit complex model, example: \\(EVENT~1+TID+SEXF*AGE.60\\) model outcome variable EVENT covariates TID (factor variable level values 1 6 denoting period time), SEXF (factor variable denoting sex) AGE.60 (quantitative variable representing age-60 years). term 1 forces model include intercept term, contrast use term 0 intercept term removed. * symbol SEXF AGE.60 means fit possible main effects interactions two covariates. takes value 0 males 0 * AGE.60 females 1 * AGE.60. model example 1 section Examples. case logarithm survival time added offset (log(survtime)). family argument can specified three types models fit: \"gaussian\" : conventional linear model normally distributed errors \"binomial\" : conventional unconditional logistic regression model \"poisson\" : Poisson regression model used survival analysis. model used Piecewise Exponential Regression (PER) typically closely approximates Cox regression main estimates standard errors. present gaussian family automatically coupled identity link function, binomial family logistic link function poisson family log link function. data argument avoids specify name data frame front covariate formula. example, data frame called DataFrame avoid write: \\(DataFrame\\$y ~ DataFrame\\$+ DataFrame\\$b + DataFrame\\$c + DataFrame\\$d\\) checks argument verifies variables model defined (exist) server-side every study correct characteristics required fit model. suggested make checks argument TRUE unexplained problem model fit encountered running process takes several minutes. maxit Logistic regression Poisson regression models can require many iterations, particularly starting value regression constant far away actual value GLM trying estimate. consequence often set maxit=30 depending nature models wish fit, may wish alerted much quickly delay convergence, may wish iterations. Privacy protected iterative fitting GLM explained : (1) Begin guess coefficient vector start iteration 1 (call beta.vector[1]). Using beta.vector[1], run iteration 1 source calculating resultant score vector (information matrix) generated data - given beta.vector[1] - sum score vector components (sum components information matrix) derived individual data record source. NB models starting values beta.vector[1] set zero parameters. (2) Transmit resultant score vector information matrix source back clientside server (CS) analysis centre. denote SCORE[1][j] INFORMATION.MATRIX[1][j] score vector information matrix generated study j end 1st iteration. (3) CS sums score vectors, equivalently information matrices, across studies (.e. j = 1:S, S number studies). Note , given beta.vector[1], gives precisely final sums score vectors information matrices obtained data one central warehoused database overall score vector information matrix end first iteration calculated (standard) simply summing across individuals. difference instead directly adding values across individuals, first sum across individuals data source sum study totals across studies - .e. generates ultimate sums (4) CS calculates sum(SCORES)%*% inverse(sum(INFORMATION.MATRICES)) - heuristically may viewed \"sum score vectors divided (NB 'matrix division') sum information matrices\". one uses conventional algorithm (IRLS) update generalized linear models iteration iteration quantity happens precisely vector added current value beta.vector (.e. beta.vector[1]) obtain beta.vector[2] improved estimate beta.vector used iteration 2. updating algorithm often called IRLS (Iterative Reweighted Least Squares) algorithm - closely related Newton Raphson approach uses expected information rather observed information. (5) Repeat steps (2)-(4) model converges (using standard R convergence criterion). NB alternative way coherently pool glm across multiple sources fit glm completion (.e. multiple iterations convergence) source return final parameter estimates standard errors CS pooled using study-level meta-analysis. alternative function ds.glmSLMA allows . fit glms completion source return final estimates standard errors (rather score vectors information matrices). rely functions R package metafor meta-analyse key parameters. Server functions called: glmDS1 glmDS2","code":""},{"path":"/reference/ds.glm.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fits Generalized Linear Model — ds.glm","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.glm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fits Generalized Linear Model — ds.glm","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') # Example 1: Fitting GLM for survival analysis # For this analysis we need to load survival data from the server builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Fit the GLM # make sure that the outcome is numeric ds.asNumeric(x.name = \"D$cens\", newobj = \"EVENT\", datasources = connections) # convert time id variable to a factor ds.asFactor(input.var.name = \"D$time.id\", newobj = \"TID\", datasources = connections) # create in the server-side the log(survtime) variable ds.log(x = \"D$survtime\", newobj = \"log.surv\", datasources = connections) ds.glm(formula = EVENT ~ 1 + TID + female * age.60, data = \"D\", family = \"poisson\", offset = \"log.surv\", weights = NULL, checks = FALSE, maxit = 20, CI = 0.95, viewIter = FALSE, viewVarCov = FALSE, viewCor = FALSE, datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) # Example 2: run a logistic regression without interaction # For this example we are going to load another dataset builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Fit the logistic regression model mod <- ds.glm(formula = \"DIS_DIAB~GENDER+PM_BMI_CONTINUOUS+LAB_HDL\", data = \"D\", family = \"binomial\", datasources = connections) mod #visualize the results of the model # Example 3: fit a standard Gaussian linear model with an interaction # We are using the same data as in example 2. mod <- ds.glm(formula = \"PM_BMI_CONTINUOUS~DIS_DIAB*GENDER+LAB_HDL\", data = \"D\", family = \"gaussian\", datasources = connections) mod # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.glmPredict.html","id":null,"dir":"Reference","previous_headings":"","what":"Applies predict.glm() to a serverside glm object — ds.glmPredict","title":"Applies predict.glm() to a serverside glm object — ds.glmPredict","text":"Applies native R's predict.glm() function serverside glm object previously created using ds.glmSLMA.","code":""},{"path":"/reference/ds.glmPredict.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Applies predict.glm() to a serverside glm object — ds.glmPredict","text":"","code":"ds.glmPredict( glmname = NULL, newdataname = NULL, output.type = \"response\", se.fit = FALSE, dispersion = NULL, terms = NULL, na.action = \"na.pass\", newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.glmPredict.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Applies predict.glm() to a serverside glm object — ds.glmPredict","text":"glmname character string identifying glm object serverside predict.glm applied. Equivalent argument native R's predict.glm described : fitted object class inheriting 'glm'. newdataname character string identifying (optional) dataframe serverside look new covariate values predict. omitted, original fitted linear predictors original glm fit used basis prediction. Precisely equivalent argument predict.glm function native R. output.type character string taking values 'response', 'link' 'terms'. value 'response' generates predictions scale original outcome, e.g. proportions logistic regression. often called 'fitted values'. value 'link' generates predictions scale linear predictor, e.g. log-odds logistic regression, log-rate log-count Poisson regression. predictions using 'response' 'link' identical standard Gaussian model identity link. value 'terms' returns either fitted values predicted values link scale based whole linear predictor separate 'terms'. , age modelled five level factor, one output components relate predictions (fitted values link scale predictions) based five levels age simultaneously. simple covariate (e.g. composite factor) treated term right. ds.glmPredict's argument precisely equivalent argument native R's predict.glm function. se.fit logical standard errors fitted predictions required. Defaults FALSE output contains vector (vectors) predicted values. TRUE, output also contains corresponding vectors standard errors predicted values, single value reporting scale parameter model. ds.glmPredict's argument precisely equivalent corresponding argument predict.glm native R. argument equivalent argument native R's predict.glm function. dispersion numeric value specifying dispersion GLM fit assumed computing standard errors. omitted, returned summary applied glm object used. e.g. unspecified dispersion assumed logistic regression Poisson model 1. dispersion set 4, standard errors predictions multiplied 2 (.e. sqrt(4)). useful making predictions models subject overdispersion. ds.glmPredict's argument precisely equivalent corresponding argument predict.glm native R. terms character vector specifying subset terms return prediction. applies output.type='terms'. ds.glmPredict's argument precisely equivalent corresponding argument predict.glm native R. na.action character string determining done missing values data.frame identified . Default na.pass predicts specified new data.frame NAs left place. na.omit removes rows containing NAs. na.fail stops function NAs anywhere data.frame. details see help native R. newobj character string specifying name serverside object output object call ds.glmPredict written study. argument specified, output object serverside defaults name \"predict_glm\". datasources specifies particular 'connection object(s)' use. e.g. several data sets sources working called opals., opals.w2, connection.xyz, can choose work . call 'datashield.connections_find()' lists different datasets available one called 'default.connections' dataset used default dataset specified. wish change connections wish use default call datashield.connections_default('opals.') set 'default.connections' 'opals.' absence specific instructions contrary (e.g. specifying particular dataset used via argument) subsequent function calls datasets held opals.. argument specified, set without inverted commas: e.g. datasources=opals.datasources=default.connections. argument also allows apply function solely subset studies/sources working . example, second source set three, can specified using call datasources=connection.xyz[2]. hand, wish specify solely first third sources, appropriate call datasources=connections.xyz[c(1,3)]","code":""},{"path":"/reference/ds.glmPredict.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Applies predict.glm() to a serverside glm object — ds.glmPredict","text":"ds.glmPredict calls serverside assign function glmPredictDS.writes new object serverside containing output precisely equivalent predict.glm native R. name serverside object given newobj argument argument missing null called \"predict_glm\". addition, ds.glmPredict calls serverside aggregate function glmPredictDS.ag returns object containing non-disclosive summary statistics relating either single prediction vector called fit , se.fit=TRUE, two vectors 'fit' 'se.fit' - latter containing standard errors predictions 'fit'. non-disclosive summary statistics vector(s) include: length, total number valid (non-missing) values, number missing values, mean standard deviation valid values 5 output always includes: name serverside glm object predicted , name - one specified - dataframe used basis predictions, output.type specified ('link', 'response' 'terms'), value dispersion parameter one specified residual scale parameter (multiplied sqrt(dispersion parameter) one set). output.type = 'terms', summary statistics fit se.fit vectors replaced equivalent summary statistics column fit se.fit matrices k columns k terms summarised.","code":""},{"path":"/reference/ds.glmPredict.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Applies predict.glm() to a serverside glm object — ds.glmPredict","text":"Clientside function calling single assign function (glmPredictDS.) single aggregate function (glmPredictDS.ag). ds.glmPredict applies native R predict.glm function glm object already created serverside fitting ds.glmSLMA. precisely glm object created native R fitting glm using glm function. Crucially, ds.glmSLMA originally applied multiple studies glm object created study based solely data study. ds.glmPredict two distinct actions. First, call assign function applies standard predict.glm function native R glm object serverside writes output normally generated predict.glm newobj serverside. critical information passed clientside, disclosure issues associated action. standard DataSHIELD functions can applied newobj interpret output. example, used basis regression diagnostic plots. Second, call aggregate function creates non-disclosive summary information held newobj created assign function returns summary clientside. example, full list predicted/fitted values generated model disclosive. although newobj holds full vector fitted values, total number values, total number valid (non-missing) values, number missing values, mean standard deviation valid values 5 returned clientside aggregate function. non-DataSHIELD arguments ds.glmPredict precisely equivalent predict.glm native R detailed information can found using help(predict.glm) native R.","code":""},{"path":"/reference/ds.glmPredict.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Applies predict.glm() to a serverside glm object — ds.glmPredict","text":"Paul Burton, DataSHIELD Development Team 13/08/20","code":""},{"path":"/reference/ds.glmSLMA.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"Fits generalized linear model (GLM) data single multiple sources pooled co-analysis across studies based SLMA (Study Level Meta Analysis).","code":""},{"path":"/reference/ds.glmSLMA.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"","code":"ds.glmSLMA( formula = NULL, family = NULL, offset = NULL, weights = NULL, combine.with.metafor = TRUE, newobj = NULL, dataName = NULL, checks = FALSE, maxit = 30, notify.of.progress = FALSE, datasources = NULL )"},{"path":"/reference/ds.glmSLMA.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"formula object class formula describing model fitted. information see Details. family identifies error distribution function use model. offset character string specifying name variable used offset.ds.glmSLMA allow offset vector written directly GLM formula. weights character string specifying name variable containing prior regression weights fitting process. ds.glmSLMA allow weights vector written directly GLM formula. combine..metafor logical. TRUE estimates standard errors regression coefficient pooled across studies using random-effects meta-analysis maximum likelihood (ML), restricted maximum likelihood (REML) fixed-effects meta-analysis (FE). Default TRUE. newobj character string specifying name object glm object representing model fit serverside study written. argument specified, output object defaults \"new.glm.obj\". dataName character string specifying name (optional) data frame contains variables GLM formula. checks logical. TRUE ds.glmSLMA checks structural integrity model. Default FALSE. information see Details. maxit numeric scalar denoting maximum number iterations permitted ds.glmSLMA declares model failed converge. information see Details. notify..progress specifies console output produced indicate progress. Default FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.glmSLMA.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"serverside aggregate functions glmSLMADS1 glmSLMADS2 return output clientside, assign function glmSLMADS.assign simply writes glm object serverside created model fit given server permanent object server. precisely glm object usually created call glm() native R contains elements (see help glm native R). serverside object, disclosure blocks apply. However, disclosure blocks apply information passed clientside. consequence, rather containing components standard glm object native R, components glm object returned ds.glmSLMA include: mixture non-disclosive elements glm object reported separately study included list object called output.summary; series list objects represent inferences aggregated across studies. study specific items include: coefficients: matrix 5 columns: First : names regression parameters (coefficients) model second : estimated values third : corresponding standard errors estimated values fourth : ratio estimate/standard error fifth : p-value treating standardised normal deviate family: indicates error distribution link function used GLM. formula: model formula, see description formula input parameter (). df.resid: residual degrees freedom around model. deviance.resid: residual deviance around model. df.null: degrees freedom around null model (just intercept). dev.null: deviance around null model (just intercept). CorrMatrix: correlation matrix parameter estimates. VarCovMatrix: variance-covariance matrix parameter estimates. weights: name vector () holding regression weights. offset: name vector () holding offset (enters glm coefficient 1.00). cov.scaled: equivalent VarCovMatrix. cov.unscaled: equivalent VarCovMatrix assuming dispersion (scale) parameter 1. Nmissing: number missing observations given study. Nvalid: number valid (non-missing) observations given study. Ntotal: total number observations given study (Nvalid + Nmissing). data: equivalent input parameter dataName (). dispersion: estimated dispersion parameter: deviance.resid/df.resid gaussian family multiple regression model, 1.00 logistic poisson regression. call: summary key elements call fit model. na.action: chosen method dealing missing values. usually, na.action = na.omit - see help native R. iter: number iterations required achieve convergence glm model separate study. study-specific output returned, ds.glmSLMA returns series lists relating aggregated inferences across studies. include following: num.valid.studies: number studies valid output included combined analysis betamatrix.: matrix row regression coefficient column study reporting estimated regression coefficients study. sematrix.: matrix row regression coefficient column study reporting standard errors estimated regression coefficients study. betamatrix.valid: matrix row regression coefficient column study reporting estimated regression coefficients study studies valid output (eg violating disclosure traps) sematrix.: matrix row regression coefficient column study reporting standard errors estimated regression coefficients study studies valid output (eg violating disclosure traps) SLMA.pooled.estimates.matrix: matrix row regression coefficient six columns. first two columns contain pooled estimate regression coefficients standard error pooling via random effect meta-analysis maximum likelihood (ML). Columns 3 4 contain estimates standard errors random effect meta-analysis REML columns 5 6 estimates standard errors fixed effect meta-analysis. matrix returned argument combine..metafor set TRUE. Otherwise, users can take betamatrix.valid sematrix.valid matrices enter meta-analysis package choice. .object.created validity.check standard items returned assign function designated newobj appears successfully created serverside study. output produced specifically assign function glmSLMADS.assign writes glm object serverside","code":""},{"path":"/reference/ds.glmSLMA.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"ds.glmSLMA specifies structure Generalized Linear Model fitted separately study data source. Calls serverside functions glmSLMADS1 (aggregate),glmSLMADS2 (aggregate) glmSLMADS.assign (assign). mathematical perspective, SLMA approach (using ds.glmSLMA) differs fundamentally alternative approach using ds.glm. ds.glm fits model iteratively across studies together. iteration model every data source precisely coefficients model converges one essentially identifies model best fits studies simultaneously. mathematically equivalent placing individual-level data sources one central warehouse analysing data one combined dataset using conventional glm() function native R. contrast ds.glmSLMA sends command every data source fit model required separate source simply fits model completion (ie undertakes iterations model converges) estimates (regression coefficients) standard errors source sent back client pooled using SLMA via approach user wishes implement. ds.glmSLMA functions includes argument TRUE (default) pools models across studies using metafor function (metafor package) using three optimisation methods: random effects maximum likelihood (ML); random effects restricted maximum likelihood (REML); fixed effects (FE). estimates standard errors clientside, user can alternatively choose use metafor package way /wishes, pool coefficients across studies , indeed, use another meta-analysis package, code. Although ds.glm approach might first sight appear preferable circumstances, always case. First, results approaches generally similar. Secondly, SLMA approach can offer key inferential advantages marked heterogeneity sources simply corrected including fixed-effects one's ds.glm model reflect study- centre-specific effect. particular, fixed effects guaranteed generate formal inferences unbiased heterogeneity effect actually scientific interest. might argued one try pool inferences anyway marked heterogeneity, can use joint analysis formally check heterogeneity choose report pooled result separate results study individually. Crucially, unless heterogeneity substantial, pooling can quite reasonable. Furthermore, just fit ds.glm model without centre-effects effect pooling across studies without checking heterogeneity heterogeneity exists strong can get theoretically results badly confounded study. introduced ds.glmSLMA encountered real world example ds.glm (without centre effects) generated combined inferences studies extreme results individual studies: lower 95 combined estimate higher upper 95 individual studies. clearly incorrect provided salutary lesson potential impact confounding study ds.glm model include appropriate centre-effects. Even going undertake ds.glm analysis (slightly powerful heterogeneity) may still useful also carry ds.glmSLMA analysis provides easy way examine extent heterogeneity. formula shortcut notation formulas allowed R's standard glm() function also allowed ds.glmSLMA. Many glms can fitted simply using formula : \\(y~+b+c+d\\) simply means fit glm y outcome variable , b, c d covariates. default models also include intercept (regression constant) term. Instead, need fit complex model, example: \\(EVENT~1+TID+SEXF*AGE.60\\) model outcome variable EVENT covariates TID (factor variable level values 1 6 denoting period time), SEXF (factor variable denoting sex) AGE.60 (quantitative variable representing age-60 years). term 1 forces model include intercept term, contrast use term 0 intercept term removed. * symbol SEXF AGE.60 means fit possible main effects interactions two covariates. takes value 0 males 0 * AGE.60 females 1 * AGE.60. model example 1 section Examples. case logarithm survival time added offset (log(survtime)). family argument range model types can fitted. range recently extended include number model types non-standard used relatively widely. standard models include: \"gaussian\" : conventional linear model normally distributed errors \"binomial\" : conventional unconditional logistic regression model \"poisson\" : Poisson regression model often used epidemiological analysis counts rates also used survival analysis. Piecewise Exponential Regression (PER) model typically provides close approximation Cox regression model main estimates standard errors. \"gamma\" : family models outcomes characterised constant coefficient variation, .e. variance increases square expected mean \"quasipoisson\" : model Poisson variance function - variance equals expected mean - residual variance fixed 1.00 standard Poisson model can take value. achieved dispersion parameter estimated model fit takes value K means expected variance K x expected mean, implies standard errors sqrt(K) times larger standard Poisson model fitted data. allows extra uncertainty associated 'overdispersion' occurs commonly Poisson distributed data, typically arises count/rate data modelled occur blocks exhibit heterogeneity underlying risk fully modelled, either including blocks factor including covariates determinants relevant underlying risk. overdispersion (K=1) estimates standard errors quasipoisson model almost identical standard poisson model. \"quasibinomial\" : model binomial variance function - P expected proportion successes, N number \"trials\" (always 1 analysing binary data formally described Bernoulli distribution (binomial distribution N=1) variance function N*(P)*(1-P). residual variance fixed 1.00 binomial model can take value. achieved dispersion parameter estimated model fit (see quasipoisson information ). class models \"canonical link\" represents link function maximises information extraction model. gaussian family uses identity link, poisson family log link, binomial/Bernoulli family logit link gamma family reciprocal link. dataName argument avoids specify name data frame front covariate formula. example, data frame called DataFrame avoid write: \\(DataFrame\\$y ~ DataFrame\\$+ DataFrame\\$b + DataFrame\\$c + DataFrame\\$d\\) checks argument verifies variables model defined (exist) server-site every study correct characteristics required fit model. suggested make checks argument TRUE unexplained problem model fit encountered running process takes several minutes. maxit Logistic regression Poisson regression models can require many iterations, particularly starting value regression constant far away actual value GLM trying estimate. consequence often set maxit=30 depending nature models wish fit, may wish alerted much quickly delay convergence, may wish allow iterations. Server functions called: glmSLMADS1, glmSLMADS2, glmSLMADS.assign","code":""},{"path":"/reference/ds.glmSLMA.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"Paul Burton, DataSHIELD Development Team 07/07/20","code":""},{"path":"/reference/ds.glmSLMA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a Generalized Linear Model (GLM) with pooling via Study Level Meta-Analysis (SLMA) — ds.glmSLMA","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') # Example 1: Fitting GLM for survival analysis # For this analysis we need to load survival data from the server builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Fit the GLM # make sure that the outcome is numeric ds.asNumeric(x.name = \"D$cens\", newobj = \"EVENT\", datasources = connections) # convert time id variable to a factor ds.asFactor(input.var.name = \"D$time.id\", newobj = \"TID\", datasources = connections) # create in the server-side the log(survtime) variable ds.log(x = \"D$survtime\", newobj = \"log.surv\", datasources = connections) ds.glmSLMA(formula = EVENT ~ 1 + TID + female * age.60, dataName = \"D\", family = \"poisson\", offset = \"log.surv\", weights = NULL, checks = FALSE, maxit = 20, datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) # Example 2: run a logistic regression without interaction # For this example we are going to load another type of data builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Fit the logistic regression model mod <- ds.glmSLMA(formula = \"DIS_DIAB~GENDER+PM_BMI_CONTINUOUS+LAB_HDL\", dataName = \"D\", family = \"binomial\", datasources = connections) mod #visualize the results of the model # Example 3: fit a standard Gaussian linear model with an interaction # We are using the same data as in example 2. It is not necessary to # connect again to the server mod <- ds.glmSLMA(formula = \"PM_BMI_CONTINUOUS~DIS_DIAB*GENDER+LAB_HDL\", dataName = \"D\", family = \"gaussian\", datasources = connections) mod # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.glmSummary.html","id":null,"dir":"Reference","previous_headings":"","what":"Summarize a glm object on the serverside — ds.glmSummary","title":"Summarize a glm object on the serverside — ds.glmSummary","text":"Summarize glm object serverside create summary_glm object. Also identify return components glm object summary_glm object can safely sent clientside without risk disclosure","code":""},{"path":"/reference/ds.glmSummary.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summarize a glm object on the serverside — ds.glmSummary","text":"","code":"ds.glmSummary(x.name, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.glmSummary.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summarize a glm object on the serverside — ds.glmSummary","text":"x.name character string providing name glm object serverside previously created e.g. using ds.glmSLMA newobj character string specifying name object summary_glm object representing output summary(glm object) study written. argument specified, output object serverside defaults \"summary_glm.newobj\". datasources specifies particular 'connection object(s)' use. e.g. several data sets sources working called opals., opals.w2, connection.xyz, can choose work . call 'datashield.connections_find()' lists different datasets available one called 'default.connections' dataset used default dataset specified. wish change connections wish use default call datashield.connections_default('opals.') set 'default.connections' 'opals.' absence specific instructions contrary (e.g. specifying particular dataset used via argument) subsequent function calls datasets held opals.. argument specified, set without inverted commas: e.g. datasources=opals.datasources=default.connections. argument also allows apply function solely subset studies/sources working . example, second source set three, can specified using call datasources=connection.xyz[2]. hand, wish specify solely first third sources, appropriate call datasources=connections.xyz[c(1,3)]","code":""},{"path":"/reference/ds.glmSummary.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Summarize a glm object on the serverside — ds.glmSummary","text":"ds.glmSummary writes new object serverside name given newobj argument argument missing null called \"summary_glm.newobj\". addition, ds.glmSummary returns object containing two lists clientside two lists named \"glm.obj\" \"glm.summary.obj\" contain elements original glm object summary_glm object serverside potentially disclosive components set NA masked another way see \"details\" . elements returned non-NA value glm.obj list object : \"coefficients\", \"rank\", \"family\", \"deviance\", \"aic\", \"null.deviance\", \"iter\", \"df.residual\", \"df.null\", \"converged\", \"boundary\", \"call\", \"formula\", \"terms\", \"data\", \"control\", \"method\", \"contrasts\", \"xlevels\". elements returned non-NA value glm.summary.obj list object : \"call\", \"terms\", \"family\", \"deviance\", \"aic\", \"contrasts\", \"df.residual\", \"null.deviance\", \"df.null\", \"iter\", \"coefficients\", \"aliased\", \"dispersion\", \"df\", \"cov.unscaled\", \"cov.scaled\". information see help glm summary(glm) native R ds.glmSLMA DataSHIELD.","code":""},{"path":"/reference/ds.glmSummary.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Summarize a glm object on the serverside — ds.glmSummary","text":"Clientside function calling single assign function (glmSummaryDS.) single aggregate function (glmSummaryDS.). ds.glmSummary summarises glm object already created serverside fitting ds.glmSLMA precisely glm object created fitting glm using glm function native R. Similarly summary_glm object saved serverside precisely equivalent object created using summary(glm object) R. glm object produced standard call glm R 32 components. Amongst , following thirteen contain information every records data set disclosive. therefore set NA convey information returned clientside: 1.residuals, 2.fitted.values, 3.effects, 4.R, 5.qr, 6.linear.predictors, 7.weights, 8.prior.weights, 9.y, 10.model, 11. na.action, 12.x, 13. offset. addition list element \"data\" identifies data.frame identified containing variables required model also disclosive list name data.frame rather prints full. However, user can benefit knowing source data used creating glm model element \"data\" returned clientside simply lists names columns originating data.frame. removed disclosive elements glm object, ds.glmSummary returns remaining 19 elements clientside. object created standard call summary(glm object) R contains 18 list elements. two disclosive - na.action deviance.resid therefore set NA ds.glmSummary returns 16 clientside. details components glm object summary_glm object can found help glm summary(glm) native R. addition, elements returned listed \"return\" .","code":""},{"path":"/reference/ds.glmSummary.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Summarize a glm object on the serverside — ds.glmSummary","text":"Paul Burton, DataSHIELD Development Team 17/07/20","code":""},{"path":"/reference/ds.glmerSLMA.html","id":null,"dir":"Reference","previous_headings":"","what":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"ds.glmerSLMA fits Generalized Linear Mixed-Effects Model (GLME) data one multiple sources pooling via SLMA (study-level meta-analysis).","code":""},{"path":"/reference/ds.glmerSLMA.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"","code":"ds.glmerSLMA( formula = NULL, offset = NULL, weights = NULL, combine.with.metafor = TRUE, dataName = NULL, checks = FALSE, datasources = NULL, family = NULL, control_type = NULL, control_value = NULL, nAGQ = 1L, verbose = 0, start_theta = NULL, start_fixef = NULL, notify.of.progress = FALSE, assign = FALSE, newobj = NULL )"},{"path":"/reference/ds.glmerSLMA.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"formula object class formula describing model fitted. information see Details. offset character string specifying name variable used offset. weights character string specifying name variable containing prior regression weights fitting process. combine..metafor logical. TRUE estimates standard errors regression coefficient pooled across studies using random-effects meta-analysis maximum likelihood (ML), restricted maximum likelihood (REML) fixed-effects meta-analysis (FE). Default TRUE. dataName character string specifying name data frame contains variables GLME formula. information see Details. checks logical. TRUE ds.glmerSLMA checks structural integrity model. Default FALSE. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. family character string specifying distribution observed value outcome variable around predictions generated linear predictor. can set \"binomial\" \"poisson\". information see Details. control_type optional character string vector specifying nature parameter (parameters) modified convergence control options can viewed modified via glmerControl function package lme4. information see Details. control_value numeric representing new value want allocate control parameter corresponding control-type. information see Details. nAGQ integer value indicating number points per axis evaluating adaptive Gauss-Hermite approximation log-likelihood. Defaults 1, corresponding Laplace approximation. information see R glmer function help. verbose integer value. \\(verbose > 0\\) output generated optimization parameter estimates. \\(verbose > 1\\) output generated individual penalized iteratively reweighted least squares (PIRLS) steps. Default verbose value 0 means additional output. start_theta numeric vector length equal number random effects. Specify retain control optimisation. See glmer() details. start_fixef numeric vector length equal number fixed effects (NB including intercept). Specify retain control optimisation. See glmer() details. notify..progress specifies console output produced indicate progress. Default FALSE. assign logical, indicates whether function call second server-side function (assign) order save regression outcomes (.e. glmerMod object) server. Default FALSE. newobj character string specifying name object glmerMod object representing model fit serverside study written. argument used argument assign set TRUE. argument specified, output object defaults \"new.glmer.obj\".","code":""},{"path":"/reference/ds.glmerSLMA.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"Many elements output list returned ds.glmerSLMA equivalent returned glmer() function native R. However, potentially disclosive elements individual-level residuals linear predictor values blocked. case, non-disclosive elements returned study separately. list elements returned ds.glmerSLMA mentioned : coefficients: matrix 5 columns: First : names regression parameters (coefficients) model second : estimated values third : corresponding standard errors estimated values fourth : ratio estimate/standard error fifth : p-value treating standardised normal deviate CorrMatrix: correlation matrix parameter estimates. VarCovMatrix: variance-covariance matrix parameter estimates. weights: vector () holding regression weights. offset: vector () holding offset. cov.scaled: equivalent VarCovMatrix. Nmissing: number missing observations given study. Nvalid: number valid (non-missing) observations given study. Ntotal: total number observations given study (Nvalid + Nmissing). data: equivalent input parameter dataName (). call: summary key elements call fit model. study-specific output returned, function returns number elements relating pooling estimates across studies via study-level meta-analysis. follows: input.beta.matrix..SLMA: matrix containing vector coefficient estimates study. input.se.matrix..SLMA: matrix containing vector standard error estimates coefficients study. SLMA.pooled.estimates: matrix containing pooled estimates regression coefficient across studies pooling SLMA via random-effects meta-analysis maximum likelihood (ML), restricted maximum likelihood (REML) via fixed-effects meta-analysis (FE). convergence.error.message: reports study whether model converged. information reason reported.","code":""},{"path":"/reference/ds.glmerSLMA.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"ds.glmerSLMA fits generalized linear mixed-effects model (GLME) - e.g. logistic Poisson regression model including fixed random effects - data single multiple sources. function similar glmer function lme4 package native R. multiple data sources, GLME fitted convergence data source independently. estimates standard errors returned client-side enable cross-study pooling using Study-Level Meta-Analysis (SLMA). SLMA used default metafor package SLMA occurs client-side (standard R environment), user can choose approach meta-analysis. Additional information fitting GLMEs using glmer function can obtained using R help glmer lme4 package. formula shortcut notation allowed glmer() function also allowed ds.glmerSLMA. Many GLMEs can fitted simply using formula like: \\(y~+b+(1|c)\\) simply means fit GLME y outcome variable (e.g. binary case-control using logistic regression model count survival time using Poisson regression model), b fixed effects, c random effect grouping factor. also possible fit models random slopes specifying model \\(y~+b+(1+b|c)\\) effect b can vary randomly groups defined c. Implicit nesting can specified formulas : \\(y~+b+(1|c/d)\\) \\(y~+b+(1|c)+(1|c:d)\\). dataName argument avoids specify name data frame front covariate formula. example, data frame called DataFrame avoid write: \\(DataFrame\\$y ~ DataFrame\\$+ DataFrame\\$b + (1 | DataFrame\\$c)\\). checks argument verifies variables model defined (exist) server-site every study correct characteristics required fit model. suggested make checks argument TRUE unexplained problem model fit encountered running process takes several minutes. family argument can specified two types models fit: \"binomial\" : logistic regression models \"poisson\" : poisson regression models Note fitting gaussian model (standard linear mixed model) use ds.lmerSLMA ds.glmerSLMA. information can see R help lmer glmer. control_type present one parameter can modified, namely tolerance convergence criterion gradient log-likelihood maximum likelihood achieved. enabled practical experience suggests situations model looks converged sensible parameter values formal convergence declared allow model tolerant non-zero gradient parameter values obtained formal convergence declared. default value check.conv.grad 0.001 (note default value argument ds.lmerSLMA 0.002). control_value present (see control_type) parameter can convergence tolerance check.conv.grad. general, models identified converged readily value set check.conv.grad increased default value (0.001). Please note risk model also likely declared converged local maximum global maximum likelihood. generally problem likelihood surface well behaved problem convergence might usefully compare parameter estimates standard errors obtained using default tolerance (0.001) even though formally converged obtained convergence using higher tolerance. Server function called: glmerSLMADS2","code":""},{"path":"/reference/ds.glmerSLMA.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.glmerSLMA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fits Generalized Linear Mixed-Effect Models via Study-Level Meta-Analysis — ds.glmerSLMA","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Select all rows without missing values ds.completeCases(x1 = \"D\", newobj = \"D.comp\", datasources = connections) # Fit a Poisson regression model ds.glmerSLMA(formula = \"LAB_TSC ~ LAB_HDL + (1 | GENDER)\", offset = NULL, dataName = \"D.comp\", datasources = connections, family = \"poisson\") # Clear the Datashield R sessions and logout datashield.logout(connections) builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CLUSTER.CLUSTER_SLO1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CLUSTER.CLUSTER_SLO2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CLUSTER.CLUSTER_SLO3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Fit a Logistic regression model ds.glmerSLMA(formula = \"Male ~ incid_rate +diabetes + (1 | age)\", dataName = \"D\", datasources = connections[2],#only the second server is used (study2) family = \"binomial\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.heatmapPlot.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a Heat Map plot — ds.heatmapPlot","title":"Generates a Heat Map plot — ds.heatmapPlot","text":"Generates heat map plot pooled data one plot dataset.","code":""},{"path":"/reference/ds.heatmapPlot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a Heat Map plot — ds.heatmapPlot","text":"","code":"ds.heatmapPlot( x = NULL, y = NULL, type = \"combine\", show = \"all\", numints = 20, method = \"smallCellsRule\", k = 3, noise = 0.25, datasources = NULL )"},{"path":"/reference/ds.heatmapPlot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a Heat Map plot — ds.heatmapPlot","text":"x character string specifying name numerical vector. y character string specifying name numerical vector. type character string represents type graph display. type argument can set 'combine' 'split'. Default 'combine'. information see Details. show character string represents plot focused. show argument can set '' 'zoomed'. Default ''. information see Details. numints number intervals density grid object. Default numints value 20. method character string defines heat map created. method argument can set 'smallCellsRule', 'deterministic' 'probabilistic'. Default 'smallCellsRule'. information see Details. k number nearest neighbours centroid calculated. Default k value 3. information see Details. noise percentage initial variance used variance embedded noise argument method set 'probabilistic'. Default noise value 0.25. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.heatmapPlot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a Heat Map plot — ds.heatmapPlot","text":"ds.heatmapPlot returns client-side heat map plot message specifying number invalid cells study.","code":""},{"path":"/reference/ds.heatmapPlot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a Heat Map plot — ds.heatmapPlot","text":"ds.heatmapPlot function first generates density grid uses plot graph. Cells grid density matrix hold count less filter set DataSHIELD (usually 5) considered invalid turned 0 avoid potential disclosure. message printed inform user number invalid cells. ranges returned study used process getting grid density matrix exact minimum maximum values rather close approximates real minimum maximum value. done reduce risk potential disclosure. argument type can specified two types graphics display: 'combine' : combined heat map plot displayed 'split' : heat map plotted separately argument show can specified two options: '' : ranges variables used plot limits 'zoomed' : plot zoomed region actual data argument method can specified 3 different heat map created: 'smallCellsRule' : heat map actual variables created grids low counts replaced grids zero counts 'deterministic' : heat map scaled centroids k nearest neighbours original variables created, value k set user 'probabilistic' : heat map 'noisy' variables generated. added noise follows normal distribution zero mean variance equal percentage initial variance input variable. percentage specified user argument noise k argument user can choose value k equal greater pre-specified threshold used disclosure control method lower number observations minus value threshold. default value k set equal 3 (suggest k equal , bigger , 3). Note function fails user uses default value study set bigger threshold. value k used argument method set 'deterministic'. value k ignored argument method set 'probabilistic' 'smallCellsRule'. value noise used argument method set 'probabilistic'. value noise ignored argument method set 'deterministic' 'smallCellsRule'. user can choose value noise equal greater pre-specified threshold 'nfilter.noise'. Server function called: heatmapPlotDS","code":""},{"path":"/reference/ds.heatmapPlot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a Heat Map plot — ds.heatmapPlot","text":"DataSHIELD Development Team","code":""},{"path":[]},{"path":"/reference/ds.hetcor.html","id":null,"dir":"Reference","previous_headings":"","what":"Heterogeneous Correlation Matrix — ds.hetcor","title":"Heterogeneous Correlation Matrix — ds.hetcor","text":"function based hetcor function R package polycor.","code":""},{"path":"/reference/ds.hetcor.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Heterogeneous Correlation Matrix — ds.hetcor","text":"","code":"ds.hetcor( data = NULL, ML = TRUE, std.err = TRUE, bins = 4, pd = TRUE, use = \"complete.obs\", datasources = NULL )"},{"path":"/reference/ds.hetcor.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Heterogeneous Correlation Matrix — ds.hetcor","text":"data name data frame consisting factors, ordered factors, logical variables, character variables, /numeric variables, first several variables. ML TRUE, compute maximum-likelihood estimates; FALSE (default), compute quick two-step estimates. std.err TRUE (default), compute standard errors. bins number bins use continuous variables testing bivariate normality; default 4. pd TRUE (default) correlation matrix positive-definite, attempt made adjust positive-definite matrix, using nearPD function Matrix package. Note default arguments nearPD used (except corr=TRUE); control call nearPD directly. use \"complete.obs\", remove observations missing data; \"pairwise.complete.obs\", compute correlation using observations valid data pair variables. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.hetcor.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Heterogeneous Correlation Matrix — ds.hetcor","text":"Returns object class \"hetcor\" study, following components: correlation matrix; type correlation: \"Pearson\", \"Polychoric\", \"Polyserial\"; standard errors correlations, requested; number (numbers) observations correlations based; p-values tests bivariate normality pair variables; method missing data handled: \"complete.obs\" \"pairwise.complete.obs\"; TRUE ML estimates, FALSE two-step estimates.","code":""},{"path":"/reference/ds.hetcor.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Heterogeneous Correlation Matrix — ds.hetcor","text":"Computes heterogenous correlation matrix, consisting Pearson product-moment correlations numeric variables, polyserial correlations numeric ordinal variables, polychoric correlations ordinal variables.","code":""},{"path":"/reference/ds.hetcor.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Heterogeneous Correlation Matrix — ds.hetcor","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.histogram.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a histogram plot — ds.histogram","title":"Generates a histogram plot — ds.histogram","text":"ds.histogram function plots non-disclosive histogram client-side.","code":""},{"path":"/reference/ds.histogram.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a histogram plot — ds.histogram","text":"","code":"ds.histogram( x = NULL, type = \"split\", num.breaks = 10, method = \"smallCellsRule\", k = 3, noise = 0.25, vertical.axis = \"Frequency\", datasources = NULL )"},{"path":"/reference/ds.histogram.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a histogram plot — ds.histogram","text":"x character string specifying name numerical vector. type character string represents type graph display. type argument can set 'combine' 'split'. Default 'split'. information see Details. num.breaks numeric specifying number breaks histogram. Default value 10. method character string defines histogram created. method argument can set 'smallCellsRule', 'deterministic' 'probabilistic'. Default 'smallCellsRule'. information see Details. k number nearest neighbours centroid calculated. Default k value 3. information see Details. noise percentage initial variance used variance embedded noise argument method set 'probabilistic'. Default noise value 0.25. information see Details. vertical.axis, character string defines shown vertical axis plot. vertical.axis argument can set 'Frequency' 'Density'. Default 'Frequency'. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.histogram.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a histogram plot — ds.histogram","text":"one histogram objects plots depending argument type","code":""},{"path":"/reference/ds.histogram.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a histogram plot — ds.histogram","text":"ds.histogram function allows user plot distinct histograms (one study) combined histogram merges single plots. argument type can specified two types graphics display: 'combine' : histogram merges single plot displayed. 'split' : histogram plotted separately. argument method can specified 3 different histograms created: 'smallCellsRule' : histogram actual variable created bins low counts removed. 'deterministic' : histogram scaled centroids k nearest neighbours original variable value k set user. 'probabilistic' : histogram shows original distribution disturbed addition random stochastic noise. added noise follows normal distribution zero mean variance equal percentage initial variance input variable. percentage specified user argument noise. k argument user can choose value k equal greater pre-specified threshold used disclosure control method lower number observations minus value threshold. default value k set equal 3 (suggest k equal , bigger , 3). Note function fails user uses default value study set bigger threshold. value k used argument method set 'deterministic'. value k ignored argument method set 'probabilistic' 'smallCellsRule'. noise argument percentage initial variance used variance embedded noise argument method set 'probabilistic'. value noise ignored argument method set 'deterministic' 'smallCellsRule'. user can choose value noise equal greater pre-specified threshold 'nfilter.noise'. default value noise set equal 0.25. argument vertical.axis can specified two types histograms: 'Frequency' : histogram frequencies returned. 'Density' : histogram densities returned. Server function called: histogramDS2","code":""},{"path":"/reference/ds.histogram.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a histogram plot — ds.histogram","text":"DataSHIELD Development Team","code":""},{"path":[]},{"path":"/reference/ds.igb_standards.html","id":null,"dir":"Reference","previous_headings":"","what":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"Converts birth measurements INTERGROWTH z-scores/centiles (generic)","code":""},{"path":"/reference/ds.igb_standards.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"","code":"ds.igb_standards( gagebrth = NULL, z = 0, p = 50, val = NULL, var = NULL, sex = NULL, fun = \"igb_value2zscore\", newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.igb_standards.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"gagebrth name \"gestational age birth days\" variable. z z-score(s) convert (must 0 1). Default value 0. value used fun set \"igb_zscore2value\". p centile(s) convert (must 0 100). Default value p=50. value used fun set \"igb_centile2value\". val name anthropometric variable convert. var name measurement convert (\"lencm\", \"wtkg\", \"hcircm\", \"wlr\"). sex name sex factor variable. variable coded Male/Female. coded differently (e.g. 0/1), can use ds.recodeValues function recode categories Male/Female use ds.igb_standards. fun name function used. can one : \"igb_centile2value\", \"igb_zscore2value\", \"igb_value2zscore\" (default), \"igb_value2centile\". newobj character string provides name output variable stored data servers. Default name set igb.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.igb_standards.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"assigns converted measurement new object server-side","code":""},{"path":"/reference/ds.igb_standards.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"gestational ages 24 33 weeks, INTERGROWTH early preterm standard used.","code":""},{"path":"/reference/ds.igb_standards.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"Villar, J., Ismail, L.C., Victora, C.G., Ohuma, E.O., Bertino, E., Altman, D.G., Lambert, ., Papageorghiou, .T., Carvalho, M., Jaffer, Y.., Gravett, M.G., Purwar, M., Frederick, .O., Noble, .J., Pang, R., Barros, F.C., Chumlea, C., Bhutta, Z.., Kennedy, S.H., 2014. International standards newborn weight, length, head circumference gestational age sex: Newborn Cross-Sectional Study INTERGROWTH-21st Project. Lancet 384, 857–868. https://doi.org/10.1016/S0140-6736(14)60932-6 Villar, J., Giuliani, F., Fenton, T.R., Ohuma, E.O., Ismail, L.C., Kennedy, S.H., 2016. INTERGROWTH-21st preterm size birth reference charts. Lancet 387, 844–845. https://doi.org/10.1016/S0140-6736(16)00384-6","code":""},{"path":"/reference/ds.igb_standards.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Converts birth measurements to intergrowth z-scores/centiles — ds.igb_standards","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.isNA.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks if a server-side vector is empty — ds.isNA","title":"Checks if a server-side vector is empty — ds.isNA","text":"function similar R function .na instead vector booleans returns just one boolean tell elements missing values.","code":""},{"path":"/reference/ds.isNA.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks if a server-side vector is empty — ds.isNA","text":"","code":"ds.isNA(x = NULL, datasources = NULL, classConsistencyCheck = TRUE)"},{"path":"/reference/ds.isNA.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks if a server-side vector is empty — ds.isNA","text":"x character string specifying name vector check. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.isNA.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks if a server-side vector is empty — ds.isNA","text":"ds.isNA returns boolean. TRUE vector empty (values NA), FALSE otherwise.","code":""},{"path":"/reference/ds.isNA.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks if a server-side vector is empty — ds.isNA","text":"certain analyses GLM none variables missing complete (.e. missing value observation). Since DataSHIELD possible see data important know whether vector empty proceed accordingly. Server function called: isNaDS","code":""},{"path":"/reference/ds.isNA.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Checks if a server-side vector is empty — ds.isNA","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.isNA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Checks if a server-side vector is empty — ds.isNA","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # check if all the observation of the variable 'LAB_HDL' are missing (NA) ds.isNA(x = 'D$LAB_HDL', datasources = connections) #all servers are used ds.isNA(x = 'D$LAB_HDL', datasources = connections[1]) #only the first server is used (study1) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.isValid.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks if a server-side object is valid — ds.isValid","title":"Checks if a server-side object is valid — ds.isValid","text":"Checks vector table structure number observations equal greater threshold set DataSHIELD.","code":""},{"path":"/reference/ds.isValid.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks if a server-side object is valid — ds.isValid","text":"","code":"ds.isValid(x = NULL, datasources = NULL)"},{"path":"/reference/ds.isValid.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks if a server-side object is valid — ds.isValid","text":"x character string specifying name vector, dataframe matrix. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.isValid.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks if a server-side object is valid — ds.isValid","text":"ds.isValid returns boolean. TRUE input object valid, FALSE otherwise.","code":""},{"path":"/reference/ds.isValid.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks if a server-side object is valid — ds.isValid","text":"DataSHIELD, analyses possible valid objects ensure output disclosive. function checks input object valid. vector valid number observations equal greater set threshold. factor vector valid levels (categories) count equal greater set threshold. data frame matrix valid number rows equal greater set threshold. Server function called: isValidDS","code":""},{"path":"/reference/ds.isValid.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Checks if a server-side object is valid — ds.isValid","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.isValid.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Checks if a server-side object is valid — ds.isValid","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Check if the dataframe assigned above is valid ds.isValid(x = 'D', datasources = connections) #all servers are used ds.isValid(x = 'D', datasources = connections[2]) #only the second server is used (study2) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.kurtosis.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates the kurtosis of a numeric variable — ds.kurtosis","title":"Calculates the kurtosis of a numeric variable — ds.kurtosis","text":"function calculates kurtosis numeric variable.","code":""},{"path":"/reference/ds.kurtosis.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates the kurtosis of a numeric variable — ds.kurtosis","text":"","code":"ds.kurtosis( x = NULL, method = 1, type = \"both\", datasources = NULL, classConsistencyCheck = FALSE )"},{"path":"/reference/ds.kurtosis.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates the kurtosis of a numeric variable — ds.kurtosis","text":"x string character, name numeric variable. method integer 1 3 selecting one algorithms computing kurtosis detailed . default value set 1. type character represents type analysis carry . type set 'combine', 'combined', 'combines' 'c', global kurtosis returned type set 'split', 'splits' 's', kurtosis returned separately study. type set '' 'b', sets outputs produced. default value set ''. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default FALSE.","code":""},{"path":"/reference/ds.kurtosis.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates the kurtosis of a numeric variable — ds.kurtosis","text":"matrix showing kurtosis input numeric variable number valid observations.","code":""},{"path":"/reference/ds.kurtosis.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates the kurtosis of a numeric variable — ds.kurtosis","text":"function calculates kurtosis input variable x three different methods. method specified argument method. x contains missings, function removes calculation kurtosis. method set 1 following formula used \\( kurtosis= \\frac{\\sum_{=1}^{N} (x_i - \\bar(x))^4 /N}{(\\sum_{=1}^{N} ((x_i - \\bar(x))^2) /N)^(2) } - 3\\), \\( \\bar{x} \\) mean x \\(N\\) number observations. method set 2 following formula used \\( kurtosis= ((N+1)*(\\frac{\\sum_{=1}^{N} (x_i - \\bar(x))^4 /N}{(\\sum_{=1}^{N} ((x_i - \\bar(x))^2) /N)^(2) } - 3) + 6)*((N-1)/((N-2)*(N-3)))\\). method set 3 following formula used \\( kurtosis= (\\frac{\\sum_{=1}^{N} (x_i - \\bar(x))^4 /N}{(\\sum_{=1}^{N} ((x_i - \\bar(x))^2) /N)^(2) })*(1-1/N)^2 - 3\\). function similar function kurtosis R package e1071.","code":""},{"path":"/reference/ds.kurtosis.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates the kurtosis of a numeric variable — ds.kurtosis","text":"Demetris Avraam, DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.length.html","id":null,"dir":"Reference","previous_headings":"","what":"Gets the length of an object in the server-side — ds.length","title":"Gets the length of an object in the server-side — ds.length","text":"function gets length vector list stored server-side. function similar R function length.","code":""},{"path":"/reference/ds.length.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gets the length of an object in the server-side — ds.length","text":"","code":"ds.length( x = NULL, type = \"both\", datasources = NULL, classConsistencyCheck = TRUE )"},{"path":"/reference/ds.length.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gets the length of an object in the server-side — ds.length","text":"x character string specifying name vector list. type character represents type analysis carry . type set 'combine', 'combined', 'combines' 'c', global length returned type set 'split', 'splits' 's', length returned separately study. type set '' 'b', sets outputs produced. Default ''. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.length.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gets the length of an object in the server-side — ds.length","text":"ds.length returns client-side pooled length vector list, length vector list study separately.","code":""},{"path":"/reference/ds.length.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gets the length of an object in the server-side — ds.length","text":"Server function called: lengthDS","code":""},{"path":"/reference/ds.length.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Gets the length of an object in the server-side — ds.length","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.length.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Gets the length of an object in the server-side — ds.length","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Get the total number of observations of the vector of # variable 'LAB_TSC' across all the studies ds.length(x = 'D$LAB_TSC', type = 'combine', datasources = connections) # Example 2: Get the number of observations of the vector of variable # 'LAB_TSC' for each study separately ds.length(x = 'D$LAB_TSC', type = 'split', datasources = connections) # Example 3: Get the number of observations on each study and the total # number of observations across all the studies for the variable 'LAB_TSC' ds.length(x = 'D$LAB_TSC', type = 'both', datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.levels.html","id":null,"dir":"Reference","previous_headings":"","what":"Produces levels attributes of a server-side factor — ds.levels","title":"Produces levels attributes of a server-side factor — ds.levels","text":"function provides access level attribute factor variable stored server-side. function similar R function levels.","code":""},{"path":"/reference/ds.levels.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Produces levels attributes of a server-side factor — ds.levels","text":"","code":"ds.levels(x = NULL, datasources = NULL)"},{"path":"/reference/ds.levels.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Produces levels attributes of a server-side factor — ds.levels","text":"x character string specifying name factor variable. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.levels.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Produces levels attributes of a server-side factor — ds.levels","text":"ds.levels returns client-side levels factor class variable stored server-side.","code":""},{"path":"/reference/ds.levels.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Produces levels attributes of a server-side factor — ds.levels","text":"Server function called: levelsDS","code":""},{"path":"/reference/ds.levels.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Produces levels attributes of a server-side factor — ds.levels","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.levels.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Produces levels attributes of a server-side factor — ds.levels","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Get the levels of the PM_BMI_CATEGORICAL variable ds.levels(x = 'D$PM_BMI_CATEGORICAL', datasources = connections)#all servers are used ds.levels(x = 'D$PM_BMI_CATEGORICAL', datasources = connections[2])#only the second server is used (study2) # Example 2: Get the levels of the LAB_TSC variable # This example should not work because LAB_TSC is a continuous variable ds.levels(x = 'D$LAB_TSC', datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.lexis.html","id":null,"dir":"Reference","previous_headings":"","what":"Represents follow-up in multiple states on multiple time scales — ds.lexis","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"function takes data frame containing survival data expands converting records level individual subjects (survival time, censoring status, IDs variables) multiple records series pre-defined time intervals.","code":""},{"path":"/reference/ds.lexis.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"","code":"ds.lexis( data = NULL, intervalWidth = NULL, idCol = NULL, entryCol = NULL, exitCol = NULL, statusCol = NULL, variables = NULL, expandDF = NULL, datasources = NULL )"},{"path":"/reference/ds.lexis.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"data character string specifying name data frame containing survival data expanded. intervalWidth numeric vector specifying length interval. information see Details. idCol character string denoting column name holds individual IDs subjects. information see Details. entryCol character string denoting column name holds entry times (.e. start follow ). information see Details. exitCol character string denoting column name holds exit times (.e. end follow ). information see Details. statusCol character string denoting column name holds failure/censoring status subject. information see Details. variables vector character strings denoting column names additional variables include final expanded table. information see Details. expandDF character string denoting name new data frame containing expanded data set. Default lexis.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.lexis.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"ds.lexis returns server-side data frame study expanded version input table.","code":""},{"path":"/reference/ds.lexis.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"function ds.lexis splits survival interval time subjects pre-specified sub-intervals assumed encompass constant base-line hazard means constant instantaneous risk death). expanded dataset row included every interval given individual followed - regardless short long period may . row includes: (1) CENSOR: variable indicating failure status particular interval interval also known censoring status. variable can take two values: 1 representing patient died, relapsed developed disease. 0 representing lost--follow-passed right interval without failing. (2) SURVTIME exposure-time variable indicating duration exposure--risk--failure corresponding individual experienced interval /failed censored. illustrate, individual survives 5 intervals dies/fails 6th interval allocated 0 value failure status/censoring variable first five intervals 1 value 6th, exposure-time variable equal total length relevant interval first five intervals, additional length time survived sixth interval failed censored. survive first interval censored second interval, failure-status variable take value 0 intervals. (3) UID.expanded expanded data set also includes unique ID form 77.13 identifies row dataset relating 77th individual input data set /experience (exposure-time failure status)14th interval. Note .N indicates (N+1)th interval interval 1 suffix. (4) IDSEQ first part UID.expanded ('.'). value variable repeated every row corresponding individual contributes data (.e. every row corresponding interval individual followed). (5) expanded dataset contains variables individual user like carry forward survival analysis based expanded data. Typically, include original ID specified data repository, total survival time (equivalent sum exposure times across intervals) ultimate failure-status final interval exposed. value variables also repeated every row corresponding interval individual followed. intervalWidth argument total sum duration across intervals less maximum follow-individual contributing study, final interval added ds.lexis extending end last interval specified maximum follow-time. single numeric value specified rather vector, ds.lexis keep adding intervals length specified maximum follow-time single study exceeded. argument subject disclosure checks. idCol argument must numeric character. Note particular variable identified main ID data repository data first transferred data repository (.e. DataSHIELD used), ID often ends class character sorted alphabetic order (treating digit character) rather numeric. example, containing sequential IDs 1-1000, order IDs : 1,10,100,101,102,103,104,105,106,107,108,109,11 ... alphabetic listing: expected order: 1,2,3,4,5,6,7,8,9,10,11,12,13 ... alphabetic order ID listing carry forward expanded dataset. nature order original ID variable held idCol matter ds.lexis. Provided every individual appears original data set (expansion) order matter ds.lexis works unique numeric vector allocated 1:M (M individuals) whatever order appear original dataset. entryCol argument rather using total survival time variable identify intervals given individual exposed, ds.lexis requires initial entry time final exit time. data wish expand contain total survival time variable every individual starts follow-time 0, entry times specified zero, exit times total survival time. , entryCol either name column holding entry time individual else entryCol specified defaulted zero anyway put variable called starttime expanded data set. exitCol argument, entry times (entryCol) set, defaulted, zero, exitCol variable contain total survival times. variables argument set (null) data argument set, expanded data set contain variables data frame identified data argument. neither data variables arguments set, expanded data set include ID, exposure time failure/censoring status variables may still useful plotting survival data become available. function particularly meant used preparing data piecewise regression analysis (PAR). Although time intervals pre-specified arbitrary, even vaguely reasonable set time intervals give results similar Cox regression analysis. key issue choose survival intervals baseline hazard (risk death/disease/failure) within interval reasonably constant baseline hazard can vary freely intervals. Even choice intervals poor ultimate results typically qualitatively similar Cox regression. Increasing number intervals inevitably improve approximation true baseline hazard, addition many unnecessary time intervals slows analysis can become disclosive yet improve fit model. number failures one periods given study less specified disclosure filter determining minimum acceptable cell size table (nfilter.tab) expanded data frame created study, study-side message effect made available study via ds.message() function. Server functions called: lexisDS1, lexisDS2 lexisDS3","code":""},{"path":[]},{"path":"/reference/ds.lexis.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.lexis.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Represents follow-up in multiple states on multiple time scales — ds.lexis","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') # Example 1: Fitting GLM for survival analysis # For this analysis we need to load survival data from the server builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Create the expanded data frame. #The survival time intervals are to be 0 0\\) output generated optimization parameter estimates. \\(verbose > 1\\) output generated individual penalized iteratively reweighted least squares (PIRLS) steps. Default verbose value 0 means additional output. notify..progress specifies console output produced indicate progress. Default FALSE. assign logical, indicates whether function call second server-side function (assign) order save regression outcomes (.e. lmerMod object) server. Default FALSE. newobj character string specifying name object lmerMod object representing model fit serverside study written. argument used argument assign set TRUE. argument specified, output object defaults \"new.lmer.obj\".","code":""},{"path":"/reference/ds.lmerSLMA.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fits Linear Mixed-Effect model via Study-Level Meta-Analysis — ds.lmerSLMA","text":"Many elements output list returned ds.lmerSLMA equivalent returned lmer() function native R. However, potentially disclosive elements individual-level residuals linear predictor values blocked. case, non-disclosive elements returned study separately. list elements returned ds.lmerSLMA mentioned : ds.lmerSLMA returns list elements mentioned separately study. coefficients: matrix 5 columns: First : names regression parameters (coefficients) model second : estimated values third : corresponding standard errors estimated values fourth : ratio estimate/standard error fifth : p-value treating standardised normal deviate CorrMatrix: correlation matrix parameter estimates. VarCovMatrix: variance-covariance matrix parameter estimates. weights: vector () holding regression weights. offset: vector () holding offset. cov.scaled: equivalent VarCovMatrix. Nmissing: number missing observations given study. Nvalid: number valid (non-missing) observations given study. Ntotal: total number observations given study (Nvalid + Nmissing). data: equivalent input parameter dataName (). call: summary key elements call fit model. small number esoteric items information returned ds.lmerSLMA. Additional information can found help file lmer() function lme4 package. study-specific output returned, function returns several elements relating pooling estimates across studies via study-level meta-analysis. follows: input.beta.matrix..SLMA: matrix containing vector coefficient estimates study. input.se.matrix..SLMA: matrix containing vector standard error estimates coefficients study. SLMA.pooled.estimates: matrix containing pooled estimates regression coefficient across studies pooling SLMA via random-effects meta-analysis maximum likelihood (ML), restricted maximum likelihood (REML) via fixed-effects meta-analysis (FE). convergence.error.message: reports study whether model converged. information reason reported.","code":""},{"path":"/reference/ds.lmerSLMA.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fits Linear Mixed-Effect model via Study-Level Meta-Analysis — ds.lmerSLMA","text":"ds.lmerSLMA fits Linear Mixed Effects Model (lme) - can include fixed random effects - data single multiple sources. function similar lmer function lme4 package native R. multiple data sources, LME fitted convergence data source independently. estimates standard errors returned client-side enable cross-study pooling using Study-Level Meta-Analysis (SLMA). SLMA used default metafor package SLMA occurs client-side (standard R environment), user can choose approach meta-analysis. Additional information fitting LMEs using lmer function can obtained using R help lmer lme4 package. formula shortcut notation allowed lmer() function also allowed ds.lmerSLMA. Many LMEs can fitted simply using formula like: \\(y ~ + b + (1 | c)\\) simply means fit LME y outcome variable b fixed effects, c random effect grouping factor. also possible fit models random slopes specifying model \\(y ~ + b + (1 + b | c)\\) effect b can vary randomly groups defined c. Implicit nesting can specified formulae \\(y ~ + b + (1 | c / d)\\) \\(y ~ + b + (1 | c) + (1 | c : d)\\). dataName argument avoids specify name data frame front covariate formula. example, data frame called DataFrame avoid write: \\(DataFrame\\$y ~ DataFrame\\$+ DataFrame\\$b + (1 | DataFrame\\$c)\\). checks argument verifies variables model defined (exist) server-site every study correct characteristics required fit model. suggested make checks argument TRUE unexplained problem model fit encountered running process takes several minutes. REML can help mitigate bias associated fixed-effects. See help lmer() function details. control_type present one parameter can modified, namely tolerance convergence criterion gradient log-likelihood maximum likelihood achieved. enabled practical experience suggests situations model looks converged sensible parameter values formal convergence declared allow model tolerant non-zero gradient parameter values obtained formal convergence declared. default value check.conv.grad 0.002. control_value present (see control_type) parameter can convergence tolerance check.conv.grad. general, models identified converged readily value set check.conv.grad increased default (0.002). Please note risk model also likely declared converged local maximum global maximum likelihood. generally problem likelihood surface well behaved problem convergence might usefully compare parameter estimates standard errors obtained using default tolerance (0.002) even though formally converged obtained convergence using higher tolerance. optimizer argument built anything one standard optimizer available lmer - nloptwrap optimizer. users wish apply different optimizer - potentially one developed - development team can activate argument alternatives can specified. Server function called: lmerSLMADS2","code":""},{"path":"/reference/ds.lmerSLMA.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fits Linear Mixed-Effect model via Study-Level Meta-Analysis — ds.lmerSLMA","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.lmerSLMA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fits Linear Mixed-Effect model via Study-Level Meta-Analysis — ds.lmerSLMA","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CLUSTER.CLUSTER_SLO1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CLUSTER.CLUSTER_SLO2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CLUSTER.CLUSTER_SLO3\", driver = \"OpalDriver\") logindata <- builder$build() #Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Select all rows without missing values ds.completeCases(x1 = \"D\", newobj = \"D.comp\", datasources = connections) # Fit the lmer ds.lmerSLMA(formula = \"BMI ~ incid_rate + diabetes + (1 | Male)\", dataName = \"D.comp\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.log.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes logarithms in the server-side — ds.log","title":"Computes logarithms in the server-side — ds.log","text":"Computes logarithms specified numeric vector. function similar R log function. default natural logarithms.","code":""},{"path":"/reference/ds.log.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes logarithms in the server-side — ds.log","text":"","code":"ds.log(x = NULL, base = exp(1), newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.log.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes logarithms in the server-side — ds.log","text":"x character string providing name numerical vector. base positive number, base logarithms computed. Default exp(1). newobj character string provides name output variable stored server-side. Default log.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.log.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes logarithms in the server-side — ds.log","text":"ds.log returns vector study transformed values numeric vector specified argument x. created vectors stored server-side.","code":""},{"path":"/reference/ds.log.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes logarithms in the server-side — ds.log","text":"Server function called: logDS","code":""},{"path":"/reference/ds.log.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes logarithms in the server-side — ds.log","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.log.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes logarithms in the server-side — ds.log","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Calculating the log value of the 'PM_BMI_CONTINUOUS' variable ds.log(x = \"D$PM_BMI_CONTINUOUS\", base = exp(2), newobj = \"log.PM_BMI_CONTINUOUS\", datasources = connections[1]) #only the first Opal server is used (study1) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.look.html","id":null,"dir":"Reference","previous_headings":"","what":"Performs direct call to a server-side aggregate function — ds.look","title":"Performs direct call to a server-side aggregate function — ds.look","text":"function ds.look can used make direct call server-side aggregate function simply using datashield.aggregate function.","code":""},{"path":"/reference/ds.look.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Performs direct call to a server-side aggregate function — ds.look","text":"","code":"ds.look(toAggregate = NULL, checks = FALSE, datasources = NULL)"},{"path":"/reference/ds.look.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Performs direct call to a server-side aggregate function — ds.look","text":"toAggregate character string specifying function call made. information see Details. checks logical. TRUE optional checks undertaken. Default FALSE save time. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.look.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Performs direct call to a server-side aggregate function — ds.look","text":"output specified server-side aggregate function client-side.","code":""},{"path":"/reference/ds.look.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Performs direct call to a server-side aggregate function — ds.look","text":"ds.look datashield.aggregate functions generally recommended experienced developers. example, toAggregate argument expressed form server-side function usually expect client-side pair. example: ds.look(\"table1DDS(female)\") works. , express ds.look(\"table1DDS('female')\") work although call function using client-side function write ds.table1D('female') inverted commas stripped processing client-side function call server-side contain inverted commas. Apart development work (e.g. client-side function written) almost always easier less error-prone call server-side function using client-side pair. function wrapper DSI package function datashield.aggregate.","code":""},{"path":"/reference/ds.look.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Performs direct call to a server-side aggregate function — ds.look","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.look.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Performs direct call to a server-side aggregate function — ds.look","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Calculate the length of a variable using the server-side function ds.look(toAggregate = \"lengthDS(D$age.60)\", checks = FALSE, datasources = connections) #Calculate the column names of \"D\" object using the server-side function ds.look(toAggregate = \"colnames(D)\", checks = FALSE, datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.ls.html","id":null,"dir":"Reference","previous_headings":"","what":"lists all objects on a server-side environment — ds.ls","title":"lists all objects on a server-side environment — ds.ls","text":"creates list names objects specified serverside environment.","code":""},{"path":"/reference/ds.ls.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"lists all objects on a server-side environment — ds.ls","text":"","code":"ds.ls( search.filter = NULL, env.to.search = 1L, search.GlobalEnv = TRUE, datasources = NULL )"},{"path":"/reference/ds.ls.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"lists all objects on a server-side environment — ds.ls","text":"search.filter character string (potentially including * symbol) specifying filter object name want find environment. information see Details. env..search integer (e.g. 2 2L format) specifying position search path environment explored. 1L current active analytic environment server-side default value env..search. information see Details. search.GlobalEnv Logical. TRUE, ds.ls list objects .GlobalEnv R environment server-side. FALSE env..search also set valid integer, ds.ls list objects server-side R environment identified env..search search path. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.ls.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"lists all objects on a server-side environment — ds.ls","text":"ds.ls returns client-side list containing: (1) name/details server-side R environment ds.ls searched; (2) vector character strings giving names objects meeting naming criteria specified argument search.filter specified R server-side environment; (3) nature search filter string applied.","code":""},{"path":"/reference/ds.ls.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"lists all objects on a server-side environment — ds.ls","text":"running analyses one may want know objects already generated. request disclosive returns names objects contents. default, objects DataSHIELD's Active Serverside Analytic Environment (.GlobalEnv) listed. environment contains objects server-side DataSHIELD using main analysis written server-side process managing undertaking analysis (variables, scalars, matrices, data frames, etc). environment explore specified argument env..search (.e. environment search) integer value. default environment R names .GlobalEnv set specifying env..search = 1 1L (1L just explicit way writing integer 1). search.GlobalEnv argument set TRUE env..search parameter set 1L regardless value set call set NULL. , search.GlobalEnv set TRUE, ds.ls automatically search .GlobalEnv R environment server-side contains variables, data frames objects read start analysis, well new objects sort created using DataSHIELD assign functions. server-side environments contain objects. example, environment 2L contains functions loaded via native R stats package 6L contains standard list datasets built R. default ds.ls return list objects environment specified env..search argument can specify search filters including * wildcards using search.filter argument. search.filter can use symbol * find object contains specified characters. example, search.filter = \"Sd2*\" list names objects specified environment names beginning capital S, lower case d number 2. Similarly, search.filter=\"*.ID\" return objects names ending .ID, example Study.ID. value specified search.filter argument set NULL, names objects specified environment returned. Server function called: lsDS.","code":""},{"path":"/reference/ds.ls.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"lists all objects on a server-side environment — ds.ls","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.ls.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"lists all objects on a server-side environment — ds.ls","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Obtain the list of all objects on a server-side environment ds.ls(datasources = connections) #Example 2: Obtain the list of all objects that contain \"var\" character in the name #Create in the server-side variables with \"var\" character in the name ds.assign(toAssign = \"D$LAB_TSC\", newobj = \"var.LAB_TSC\", datasources = connections) ds.assign(toAssign = \"D$LAB_TRIG\", newobj = \"var.LAB_TRIG\", datasources = connections) ds.assign(toAssign = \"D$LAB_HDL\", newobj = \"var.LAB_HDL\", datasources = connections) ds.ls(search.filter = \"var*\", env.to.search = 1L, search.GlobalEnv = TRUE, datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.lspline.html","id":null,"dir":"Reference","previous_headings":"","what":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","text":"function based native R function lspline lspline package. function computes basis piecewise-linear spline , depending argument marginal, coefficients can interpreted (1) slopes consecutive spline segments, (2) slope change consecutive knots.","code":""},{"path":"/reference/ds.lspline.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","text":"","code":"ds.lspline( x, knots = NULL, marginal = FALSE, names = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.lspline.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","text":"x name input numeric variable knots numeric vector knot positions marginal logical, parametrise spline, see Details names character, vector names constructed variables newobj character string provides name output variable stored data servers. Default lspline.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.lspline.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","text":"object class \"lspline\" \"matrix\", name specified newobj argument (default name \"lspline.newobj\"), assigned serverside.","code":""},{"path":"/reference/ds.lspline.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","text":"marginal FALSE (default) coefficients spline correspond slopes consecutive segments. TRUE first coefficient correspond slope first segment. consecutive coefficients correspond change slope compared previous segment.","code":""},{"path":"/reference/ds.lspline.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.lspline","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.make.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates a new object in the server-side — ds.make","title":"Calculates a new object in the server-side — ds.make","text":"function defines new object server-side via allowed function arithmetic expression. ds.make function equivalent ds.assign, runs slightly faster.","code":""},{"path":"/reference/ds.make.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates a new object in the server-side — ds.make","text":"","code":"ds.make(toAssign = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.make.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates a new object in the server-side — ds.make","text":"toAssign character string specifying function arithmetic expression. newobj character string provides name output variable stored data servers. Default make.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.make.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates a new object in the server-side — ds.make","text":"ds.make returns new object written server-side. Also validity message returned client-side indicating whether new object correctly created source.","code":""},{"path":"/reference/ds.make.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates a new object in the server-side — ds.make","text":"new object created successfully, function verify existence required servers. Please note certain modes failure reported object created . reflects failure processing sort warrants exploration details call ds.make variables/objects invokes. TROUBLESHOOTING: please note recently identified error makes ds.make fail DataSHIELD crash. error arises call ds.make(toAssign = '5.3 + beta*xvar', newobj = 'predvals'). typical call may make get predicted values simple linear regression model y variable regressed x variable (xvar) estimated regression intercept 5.3 beta estimated regression slope. call appears fail interpreting arithmetic function first argument first encounters (length 1) scalar 5.3 encounters xvar vector one element fails - apparently recognise need replicate 5.3 value appropriate number times create vector length equal xvar value equal 5.3. two work-around solutions : (1) explicitly create vector appropriate length value equal 5.3. useful trick. First identify convenient numeric variable missing values (typically numeric individual ID) let us call indID equal length xvar (xvar may include NAs matter provided indID total length). issue call ds.make(toAssign = 'indID-indID+1',newobj = 'ONES'). creates vector ones (called ONES) source equal length indID vector source. issue second call ds.make(toAssign = 'ONES*5.3',newobj = 'vect5.3') creates required vector length equal xvar elements 5.3. Finally, can now issue modified call reflect originally needed: ds.make(toAssign = 'vect5.3+beta*xvar', 'predvals'). (2) Alternatively, simply swap original call around: ds.make(toAssign = '(beta*xvar)+5.3', newobj = 'predvals') error seems also circumvented. presumably first element arithmetic function length equal xvar knows replicate 5.3 many times second part expression. second work-around easier, worth knowing first trick creating vector ones equal length another vector can useful settings. Equally call: ds.make(toAssign = 'indID-indID',newobj = 'ZEROS') create vector zeros length may also useful. Server function : messageDS ds.make function wrapper DSI package function datashield.assign","code":""},{"path":"/reference/ds.make.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates a new object in the server-side — ds.make","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.make.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculates a new object in the server-side — ds.make","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") ##Example 1: arithmetic operators ds.make(toAssign = \"D$age.60 + D$bmi.26\", newobj = \"exprs1\", datasources = connections) ds.make(toAssign = \"D$noise.56 + D$pm10.16\", newobj = \"exprs2\", datasources = connections) ds.make(toAssign = \"(exprs1*exprs2)/3.2\", newobj = \"result.example1\", datasources = connections) ##Example 2: miscellaneous operators within functions ds.make(toAssign = \"(D$female)^2\", newobj = \"female2\", datasources = connections) ds.make(toAssign = \"(2*D$female)+(D$log.surv)-(female2*2)\", newobj = \"output.test.1\", datasources = connections) ds.make(toAssign = \"exp(output.test.1)\", newobj = \"output.test\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Creates a matrix on the server-side — ds.matrix","title":"Creates a matrix on the server-side — ds.matrix","text":"Creates matrix server-side dimensions specified nrows.scalar ncols.scalar arguments assigns values elements based mdata argument.","code":""},{"path":"/reference/ds.matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Creates a matrix on the server-side — ds.matrix","text":"","code":"ds.matrix( mdata = NA, from = \"clientside.scalar\", nrows.scalar = NULL, ncols.scalar = NULL, byrow = FALSE, dimnames = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Creates a matrix on the server-side — ds.matrix","text":"mdata character string specifying name server-side scalar vector. Also, numeric value representing scalar specified client-side can specified Zeros, negative values NAs allowed. information see Details. character string specifying source nature mdata. can set \"serverside.vector\", \"serverside.scalar\" \"clientside.scalar\". Default \"clientside.scalar\". nrows.scalar integer character string specifies number rows matrix created. information see Details. ncols.scalar integer character string specifies number columns matrix created. byrow logical. TRUE mdata vector matrix created filled row row. FALSE matrix created filled column column. Default = FALSE. dimnames list length 2 giving row column names respectively. newobj character string provides name output variable stored data servers. Default matrix.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Creates a matrix on the server-side — ds.matrix","text":"ds.matrix returns created matrix written server-side. addition, two validity messages returned indicating whether new matrix created data source whether valid form.","code":""},{"path":"/reference/ds.matrix.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Creates a matrix on the server-side — ds.matrix","text":"function similar R native function matrix(). mdata argument vector specified length total number elements matrix. TRUE values mdata used repeatedly elements matrix full. mdata argument scalar, elements matrix take value. nrows.scalar argument can character string specifying name server-side scalar. example, server-side scalar named ss.scalar exists holds value 23, specifying nrows.scalar = \"ss.scalar\", matrix created 23 rows. Also argument can numeric value client-side. rules applied ncols.scalar argument case column numbers specified. arguments zero, negative, NULL missing value permitted. Server function called: matrixDS","code":""},{"path":"/reference/ds.matrix.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Creates a matrix on the server-side — ds.matrix","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Creates a matrix on the server-side — ds.matrix","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: create a matrix with -13 value in all elements ds.matrix(mdata = -13, from = \"clientside.scalar\", nrows.scalar = 3, ncols.scalar = 8, newobj = \"cs.block\", datasources = connections) #Example 2: create a matrix of missing values ds.matrix(NA, from = \"clientside.scalar\", nrows.scalar = 4, ncols.scalar = 5, newobj = \"cs.block.NA\", datasources = connections) #Example 3: create a matrix using a server-side vector #create a vector in the server-side ds.rUnif(samp.size = 45, min = -10.5, max = 10.5, newobj = \"ss.vector\", seed.as.integer = 8321, force.output.to.k.decimal.places = 0, datasources = connections) ds.matrix(mdata = \"ss.vector\", from = \"serverside.vector\", nrows.scalar = 5, ncols.scalar = 9, newobj = \"sv.block\", datasources = connections) #Example 4: create a matrix using a server-side vector and specifying #the row a column names ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) ds.matrix(mdata = \"ss.vector.9\", from = \"serverside.vector\", nrows.scalar = 5, ncols.scalar = 9, byrow = TRUE, dimnames = list(c(\"a\",\"b\",\"c\",\"d\",\"e\")), newobj = \"sv.block.9.dimnames1\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrixDet.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"Calculates determinant square matrix written server-side. operation possible number columns rows matrix .","code":""},{"path":"/reference/ds.matrixDet.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"","code":"ds.matrixDet(M1 = NULL, newobj = NULL, logarithm = FALSE, datasources = NULL)"},{"path":"/reference/ds.matrixDet.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"M1 character string specifying name matrix. newobj character string provides name output variable stored data servers. Default matrixdet.newobj. logarithm logical. TRUE logarithm modulus determinant calculated. Default FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixDet.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"ds.matrixDet returns determinant existing matrix server-side. created new object stored server-side. Also, two validity messages returned indicating whether matrix created data source whether valid form.","code":""},{"path":"/reference/ds.matrixDet.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"Calculates determinant square matrix server-side. function similar native R determinant function. Server function called: matrixDetDS2","code":""},{"path":"/reference/ds.matrixDet.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrixDet.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculates de determinant of a matrix in the server-side — ds.matrixDet","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create the matrix in the server-side ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) ds.matrix(mdata = \"ss.vector.9\", from = \"serverside.vector\", nrows.scalar = 9,ncols.scalar = 9, byrow = TRUE, newobj = \"matrix\", datasources = connections) #Calculate the determinant of the matrix ds.matrixDet(M1 = \"matrix\", newobj = \"matrixDet\", logarithm = FALSE, datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrixDet.report.html","id":null,"dir":"Reference","previous_headings":"","what":"Returns matrix determinant to the client-side — ds.matrixDet.report","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"Calculates determinant square matrix returns result client-side","code":""},{"path":"/reference/ds.matrixDet.report.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"","code":"ds.matrixDet.report(M1 = NULL, logarithm = FALSE, datasources = NULL)"},{"path":"/reference/ds.matrixDet.report.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"M1 character string specifying name matrix. logarithm logical. TRUE logarithm modulus determinant calculated. Default FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixDet.report.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"ds.matrixDet.report returns client-side determinant matrix stored server-side.","code":""},{"path":"/reference/ds.matrixDet.report.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"Calculates returns client-side determinant square matrix server-side. function similar native R determinant function. operation possible number columns rows matrix . Server function called: matrixDetDS1","code":""},{"path":"/reference/ds.matrixDet.report.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrixDet.report.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Returns matrix determinant to the client-side — ds.matrixDet.report","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create the matrix in the server-side ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) ds.matrix(mdata = \"ss.vector.9\", from = \"serverside.vector\", nrows.scalar = 9,ncols.scalar = 9, byrow = TRUE, newobj = \"matrix\", datasources = connections) #Calculate the determinant of the matrix ds.matrixDet.report(M1 = \"matrix\", logarithm = FALSE, datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrixDiag.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates matrix diagonals in the server-side — ds.matrixDiag","title":"Calculates matrix diagonals in the server-side — ds.matrixDiag","text":"Extracts diagonal vector square matrix creates diagonal matrix based vector scalar value server-side.","code":""},{"path":"/reference/ds.matrixDiag.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates matrix diagonals in the server-side — ds.matrixDiag","text":"","code":"ds.matrixDiag( x1 = NULL, aim = NULL, nrows.scalar = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.matrixDiag.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates matrix diagonals in the server-side — ds.matrixDiag","text":"x1 character string specifying name server-side scalar vector. Also, numeric value vector specified client-side can specified. argument depends value specified aim. information see Details. aim character string specifying behaviour function. can set : \"serverside.vector.2.matrix\", \"serverside.scalar.2.matrix\", \"serverside.matrix.2.vector\", \"clientside.vector.2.matrix\" \"clientside.scalar.2.matrix\". information see Details. nrows.scalar integer specifying dimensions matrix note matrix square (number rows columns). argument specified matrix dimensions defined length vector. information see Details. newobj character string provides name output variable stored data servers. Default matrixdiag.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixDiag.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates matrix diagonals in the server-side — ds.matrixDiag","text":"ds.matrixDiag returns server-side square matrix diagonal. Also, two validity messages returned indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.matrixDiag.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates matrix diagonals in the server-side — ds.matrixDiag","text":"function behaviour different depending value specified aim argument: (1) aim = \"serverside.vector.2.matrix\" function takes server-side vector writes square matrix vector diagonal -diagonal values = 0. dimensions output matrix determined length vector. vector length k, output matrix k rows k columns. (2) aim = \"serverside.scalar.2.matrix\" function takes server-side scalar writes square matrix diagonal values equal value scalar -diagonal values = 0. dimensions square matrix determined value nrows.scalar argument. (3) aim = \"serverside.matrix.2.vector\" function takes square server-side matrix extracts diagonal values vector written server-side. (4) aim = \"clientside.vector.2.matrix\" function takes vector specified client-side writes square matrix server-side vector diagonal -diagonal values = 0. dimensions output matrix determined length vector. (5) aim = \"clientside.scalar.2.matrix\" function takes scalar specified client-side writes square matrix diagonal values equal value scalar. dimensions square matrix determined value nrows.scalar argument. x1 vector nrows.scalar set k, vector used repeatedly fill diagonal. example, vector length 7 nrows.scalar = 18, square diagonal matrix 18 rows 18 columns created. Server function called: matrixDiagDS","code":""},{"path":"/reference/ds.matrixDiag.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates matrix diagonals in the server-side — ds.matrixDiag","text":"DataSHIELD Development Team","code":""},{"path":[]},{"path":"/reference/ds.matrixDimnames.html","id":null,"dir":"Reference","previous_headings":"","what":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"Adds row names, column names matrix server-side.","code":""},{"path":"/reference/ds.matrixDimnames.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"","code":"ds.matrixDimnames( M1 = NULL, dimnames = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.matrixDimnames.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"M1 character string specifying name server-side matrix. dimnames list length 2 giving row column names respectively. empty list treated NULL. newobj character string provides name output variable stored data servers. Default matrixdimnames.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixDimnames.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"ds.matrixDimnames returns server-side matrix specified row column names. Also, two validity messages returned client-side indicating new object created data source whether valid form.","code":""},{"path":"/reference/ds.matrixDimnames.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"function similar native R dimnames function. Server function called: matrixDimnamesDS","code":""},{"path":"/reference/ds.matrixDimnames.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrixDimnames.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Specifies the dimnames of the server-side matrix — ds.matrixDimnames","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Set the row and column names of a server-side matrix #Create the server-side vector ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) #Create the server-side matrix ds.matrix(mdata = \"ss.vector.9\", from = \"serverside.vector\", nrows.scalar = 3, ncols.scalar = 4, byrow = TRUE, newobj = \"matrix\", datasources = connections) #Specify the column and row names of the matrix ds.matrixDimnames(M1 = \"matrix\", dimnames = list(c(\"a\",\"b\",\"c\"),c(\"a\",\"b\",\"c\",\"d\")), newobj = \"matrix.dimnames\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrixInvert.html","id":null,"dir":"Reference","previous_headings":"","what":"Inverts a server-side square matrix — ds.matrixInvert","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"Inverts square matrix writes output server-side","code":""},{"path":"/reference/ds.matrixInvert.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"","code":"ds.matrixInvert(M1 = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.matrixInvert.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"M1 character string specifying name matrix inverted. newobj character string provides name output variable stored data servers. Default matrixinvert.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixInvert.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"ds.matrixInvert returns server-side inverts square matrix. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.matrixInvert.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"operation possible number columns rows matrix non-singular-positive definite (e.g. row column zeros). Server function called: matrixInvertDS","code":""},{"path":"/reference/ds.matrixInvert.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrixInvert.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Inverts a server-side square matrix — ds.matrixInvert","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Invert the server-side matrix #Create the server-side vector ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) #Create the server-side matrix ds.matrix(mdata = \"ss.vector.9\", from = \"serverside.vector\", nrows.scalar = 3, ncols.scalar = 4, byrow = TRUE, newobj = \"matrix\", datasources = connections) #Invert the matrix ds.matrixInvert(M1 = \"matrix\", newobj = \"matrix.invert\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrixMult.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"Calculates matrix product two matrices writes output server-side.","code":""},{"path":"/reference/ds.matrixMult.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"","code":"ds.matrixMult(M1 = NULL, M2 = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.matrixMult.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"M1 character string specifying name first matrix. M2 character string specifying name second matrix. newobj character string provides name output variable stored data servers. Default matrixmult.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixMult.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"ds.matrixMult returns server-side result two matrix multiplication. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.matrixMult.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"Undertakes standard matrix multiplication wherewith input matrices B dimensions : m x n B: n x p output matrix C dimensions m x p. calculation valid number columns number rows B. Server function called: matrixMultDS","code":""},{"path":"/reference/ds.matrixMult.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrixMult.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculates tow matrix multiplication in the server-side — ds.matrixMult","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Multiplicate two server-side matrix #Create the server-side vector ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) #Create the server-side matrixes ds.matrix(mdata = \"ss.vector.9\",#using the created vector from = \"serverside.vector\", nrows.scalar = 5, ncols.scalar = 4, byrow = TRUE, newobj = \"matrix1\", datasources = connections) ds.matrix(mdata = 10, from = \"clientside.scalar\", nrows.scalar = 4, ncols.scalar = 6, byrow = TRUE, newobj = \"matrix2\", datasources = connections) #Multiplicate the matrixes ds.matrixMult(M1 = \"matrix1\", M2 = \"matrix2\", newobj = \"matrix.mult\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.matrixTranspose.html","id":null,"dir":"Reference","previous_headings":"","what":"Transposes a server-side matrix — ds.matrixTranspose","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"Transposes matrix writes output server-side","code":""},{"path":"/reference/ds.matrixTranspose.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"","code":"ds.matrixTranspose(M1 = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.matrixTranspose.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"M1 character string specifying name matrix. newobj character string provides name output variable stored data servers. Default matrixtranspose.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.matrixTranspose.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"ds.matrixTranspose returns server-side transpose matrix. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.matrixTranspose.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"operation converts matrix matrix C element C[,j] matrix C equals element [j,] matrix . Matrix , therefore, number rows matrix C columns vice versa. Server function called: matrixTransposeDS","code":""},{"path":"/reference/ds.matrixTranspose.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.matrixTranspose.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transposes a server-side matrix — ds.matrixTranspose","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Transpose the server-side matrix #Create the server-side vector ds.rUnif(samp.size = 9, min = -10.5, max = 10.5, newobj = \"ss.vector.9\", seed.as.integer = 5575, force.output.to.k.decimal.places = 0, datasources = connections) #Create the server-side matrix ds.matrix(mdata = \"ss.vector.9\", from = \"serverside.vector\", nrows.scalar = 3, ncols.scalar = 4, byrow = TRUE, newobj = \"matrix\", datasources = connections) #Transpose the matrix ds.matrixTranspose(M1 = \"matrix\", newobj = \"matrix.transpose\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.mdPattern.html","id":null,"dir":"Reference","previous_headings":"","what":"Display missing data patterns with disclosure control — ds.mdPattern","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"function client-side wrapper server-side mdPatternDS function. generates missing data pattern matrix similar mice::md.pattern disclosure control applied prevent revealing small cell counts.","code":""},{"path":"/reference/ds.mdPattern.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"","code":"ds.mdPattern(x = NULL, type = \"split\", datasources = NULL)"},{"path":"/reference/ds.mdPattern.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"x character string specifying name data frame matrix server-side containing data analyze. type character string specifying output type. 'split' (default), returns separate patterns study. 'combine', attempts pool patterns across studies. datasources list DSConnection-class objects obtained login. datasources argument specified, default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.mdPattern.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"type='split': list one element per study, containing: pattern missing data pattern matrix study valid Logical indicating patterns meet disclosure requirements message message describing validity status type='combine': list containing: pattern pooled missing data pattern matrix across studies valid Logical indicating pooled patterns meet disclosure requirements message message describing validity status","code":""},{"path":"/reference/ds.mdPattern.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"function calls server-side mdPatternDS function uses mice::md.pattern analyze missing data patterns. Patterns counts disclosure threshold (default: nfilter.tab = 3) suppressed maintain privacy. Output Format: - row represents missing data pattern - Pattern counts shown row names (e.g., \"150\", \"25\") - Columns show 1 variable observed, 0 missing - Last column shows total number missing values per pattern - Last row shows total number missing values per variable Disclosure Control: Suppressed patterns (count threshold) indicated : - Row name: \"suppressed()\" N threshold - pattern values set NA - Summary row also suppressed prevent back-calculation Pooling Behavior (type='combine'): pooling across studies, function uses conservative approach disclosure control: 1. Identifies identical missing patterns across studies 2. EXCLUDES suppressed patterns pooling - patterns suppressed study included pooled count 3. Sums counts non-suppressed identical patterns 4. Re-validates pooled counts disclosure threshold Important: conservative approach means: - Pooled counts may underestimates studies suppressed patterns - prevents disclosure subtraction (e.g., study shows count=5 pool shows count=7, one deduce study B count=2, violating disclosure) - Different patterns across studies preserved separately pooled result","code":""},{"path":"/reference/ds.mdPattern.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"Xavier Escribà montagut DataSHIELD Development Team","code":""},{"path":"/reference/ds.mdPattern.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Display missing data patterns with disclosure control — ds.mdPattern","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Get missing data patterns for each study separately patterns_split <- ds.mdPattern(x = \"D\", type = \"split\", datasources = connections) # View results for study1 print(patterns_split$study1$pattern) # var1 var2 var3 # 150 1 1 1 0 <- 150 obs complete # 25 0 1 1 1 <- 25 obs missing var1 # 25 0 0 25 <- Summary: 25 missing per variable # Get pooled missing data patterns across studies patterns_pooled <- ds.mdPattern(x = \"D\", type = \"combine\", datasources = connections) print(patterns_pooled$pattern) # Example with suppressed patterns: # If study1 has a pattern with count=2 (suppressed) and study2 has same pattern # with count=5 (valid), the pooled result will show count=5 (conservative approach) # A warning will indicate: \"Pooled counts may underestimate the true total\" # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.mean.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes server-side vector statistical mean — ds.mean","title":"Computes server-side vector statistical mean — ds.mean","text":"function computes statistical mean given server-side vector.","code":""},{"path":"/reference/ds.mean.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes server-side vector statistical mean — ds.mean","text":"","code":"ds.mean( x = NULL, type = \"split\", save.mean.Nvalid = FALSE, datasources = NULL, classConsistencyCheck = FALSE )"},{"path":"/reference/ds.mean.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes server-side vector statistical mean — ds.mean","text":"x character specifying name numerical vector. type character string represents type analysis carry . can set 'combine', 'combined', 'combines', 'split', 'splits', 's', '' 'b'. information see Details. save.mean.Nvalid logical. TRUE generated values mean number valid (non-missing) observations saved data servers. Default FALSE. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default FALSE.","code":""},{"path":"/reference/ds.mean.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes server-side vector statistical mean — ds.mean","text":"ds.mean returns client-side list including: Mean..Study: estimated mean, Nmissing (number missing observations), Nvalid (number valid observations) Ntotal (sum missing valid observations) separately study (type = split type = ). Global.Mean: estimated mean, Nmissing, Nvalid Ntotal across studies combined (type = combine type = ). Nstudies: number studies analysed. save.mean.Nvalid set TRUE, objects Nvalid..studies, Nvalid.study.specific, mean..studies mean.study.specific written server-side.","code":""},{"path":"/reference/ds.mean.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes server-side vector statistical mean — ds.mean","text":"function similar R function mean. function can carry 3 types analysis depending argument type: (1) type set 'combine', 'combined', 'combines' 'c', global mean calculated. (2) type set 'split', 'splits' 's', mean calculated separately study. (3) type set '' 'b', sets outputs produced. argument save.mean.Nvalid set TRUE study-specific means Nvalids well global equivalents across studies combined saved server-side. estimated means Nvalids written server-side R environments, can used directly centralize variable interest around global mean study-specific means. Finally, isDefined internal function checks whether key variables created. Server function called: meanDS","code":""},{"path":[]},{"path":"/reference/ds.mean.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes server-side vector statistical mean — ds.mean","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.mean.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes server-side vector statistical mean — ds.mean","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Calculate the mean of a vector in the server-side ds.mean(x = \"D$LAB_TSC\", type = \"split\", save.mean.Nvalid = FALSE, datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.meanByClass.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the mean and standard deviation across categories — ds.meanByClass","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"function calculates mean standard deviation (SD) continuous variable class 3 categorical variables.","code":""},{"path":"/reference/ds.meanByClass.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"","code":"ds.meanByClass( x = NULL, outvar = NULL, covar = NULL, type = \"combine\", datasources = NULL )"},{"path":"/reference/ds.meanByClass.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"x character string specifying name dataset text formula. outvar character vector specifying names continuous variables. covar character vector specifying names 3 categorical variables type character string represents type analysis carry . type can set : 'combine' 'split'. Default 'combine'. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.meanByClass.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"ds.meanByClass returns client-side table list tables hold length numeric variable(s) mean standard deviation subgroup (subset).","code":""},{"path":"/reference/ds.meanByClass.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"function splits input dataset subsets (one category) calculates mean SD specified numeric variables. important note process generating final table(s) can time consuming particularly subsetting done across one categorical variable run-time lengthens parameter type set 'split' table produced study. therefore advisable run function studies user interested including studies parameter datasources. Depending variable type can carried two analysis: (1) 'combine': pooled table results generated. (2) 'split': table results generated study.","code":""},{"path":[]},{"path":"/reference/ds.meanByClass.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.meanByClass.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the mean and standard deviation across categories — ds.meanByClass","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Calculate mean by class ds.meanByClass(x = \"D\", outvar = c('LAB_HDL','LAB_TSC'), covar = c('PM_BMI_CATEGORICAL'), type = \"combine\", datasources = connections) ds.meanByClass(x = \"D$LAB_HDL~D$PM_BMI_CATEGORICAL\", type = \"combine\", datasources = connections[1])#Only the frist server is used (\"study1\") # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.meanSdGp.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"function calculates mean SD continuous variable class single factor.","code":""},{"path":"/reference/ds.meanSdGp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"","code":"ds.meanSdGp( x = NULL, y = NULL, type = \"both\", datasources = NULL, classConsistencyCheck = TRUE )"},{"path":"/reference/ds.meanSdGp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"x character string specifying name numeric continuous variable. y character string specifying name categorical variable class factor. type character string represents type analysis carry . can set : \"combine\", \"split\" \"\". Default \"\". information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.meanSdGp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"ds.meanSdGp returns client-side mean, SD, Nvalid SEM combined across studies /separately study, depending argument type.","code":""},{"path":"/reference/ds.meanSdGp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"function calculates mean, standard deviation (SD), N (number observations) standard error mean (SEM) continuous variable broken subgroups defined single factor. important differences ds.meanSdGp function compared function ds.meanByClass: () ds.meanSdGp actually subset data simply calculates required statistics reports . means use function wish physically break data subsets. hand, makes function much faster ds.meanByClass need create physical subsets. (B) ds.meanByClass allows specify three categorising factors, ds.meanSdGp allows one. However, serious problem. two factors (e.g. sex two levels [0,1] BMI.categorical three levels [1,2,3]) simply need create new factor combines two together way gives combination levels different value new factor. , example given, calculation newfactor = (3*sex) + BMI gives six values: (1) sex = 0 BMI = 1 -> newfactor = 1 (2) sex = 0 BMI = 2 -> newfactor = 2 (3) sex = 0 BMI = 3 -> newfactor = 3 (4) sex = 1 BMI = 1 -> newfactor = 4 (5) sex = 1 BMI = 2 -> newfactor = 5 (6) sex = 1 BMI = 3 -> newfactor = 6 (C) present, ds.meanByClass calculates sample size group mean total sample size (.e. includes observations group regardless whether include missing values continuous variable factor). calculation sample size group ds.meanSdGp always reports number observations non-missing continuous variable factor. makes sense - case ds.meanByClass, total size physical subsets important, comes ds.meanSdGp undertakes analysis without physical subsetting, observations non-missing values variables contribute calculation means SDs within group logical consider counts primary. reference ds.meanSdGp makes missing counts reporting Ntotal Nmissing overall (ie broken group). future, plan extend ds.meanByClass report total non-missing counts subgroups. Depending variable type can carried different analysis: (1) \"combine\": pooled table results generated. (2) \"split\" table results generated study. (3) \"\" sets outputs produced. Server function called: meanSdGpDS","code":""},{"path":[]},{"path":"/reference/ds.meanSdGp.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.meanSdGp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the mean and standard deviation across groups defined by one factor — ds.meanSdGp","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: Calculate the mean, SD, Nvalid and SEM of the continuous variable age.60 (age in #years centralised at 60), broken down by time.id (a six level factor relating to survival time) #and report the pooled results combined across studies. ds.meanSdGp(x = \"D$age.60\", y = \"D$time.id\", type = \"combine\", datasources = connections) #Example 2: Calculate the mean, SD, Nvalid and SEM of the continuous variable age.60 (age in #years centralised at 60), broken down by time.id (a six level factor relating to survival time) #and report both study-specific results and the pooled results combined across studies. #Save the returned output to msg.b. ds.meanSdGp(x = \"D$age.60\", y = \"D$time.id\", type = \"both\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.merge.html","id":null,"dir":"Reference","previous_headings":"","what":"Merges two data frames in the server-side — ds.merge","title":"Merges two data frames in the server-side — ds.merge","text":"Merges (links) two data frames together based common values defined vectors data frame.","code":""},{"path":"/reference/ds.merge.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merges two data frames in the server-side — ds.merge","text":"","code":"ds.merge( x.name = NULL, y.name = NULL, by.x.names = NULL, by.y.names = NULL, all.x = FALSE, all.y = FALSE, sort = TRUE, suffixes = c(\".x\", \".y\"), no.dups = TRUE, incomparables = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.merge.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Merges two data frames in the server-side — ds.merge","text":"x.name character string specifying name first data frame merged. length string less specified threshold nfilter.stringShort one disclosure prevention checks DataSHIELD. y.name character string specifying name second data frame merged. length string less specified threshold nfilter.stringShort one disclosure prevention checks DataSHIELD. .x.names character string vector names specifying column(s) data frame x.name merging. .y.names character string vector names specifying column(s) data frame y.name merging. .x logical. TRUE extra rows added output, one row x.name matching row y.name. FALSE rows data data frames included output. Default FALSE. .y logical. TRUE extra rows added output, one row y.name matching row x.name. FALSE rows data data frames included output. Default FALSE. sort logical. TRUE merged result sorted elements .x.names .y.names columns. Default TRUE. suffixes character vector length 2 specifying suffixes used making unique common column names two input data frames appear merged data frame. .dups logical. Suffixes appended cases avoid duplicated column names merged data frame. Default TRUE (FALSE R version 3.5.0). incomparables values matched. intended used merging one column, incomparable values column. information see match native R merge function. newobj character string provides name output variable stored data servers. Default merge.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.merge.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Merges two data frames in the server-side — ds.merge","text":"ds.merge returns merged data frame written server-side. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.merge.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Merges two data frames in the server-side — ds.merge","text":"function similar native R function merge. changes compared native R function choosing variables use merge data frames, function merge flexible. example, can choose merge using vectors appear data frames. However, ds.merge DataSHIELD required vectors dictate merging explicitly identified data frames using .x.names .y.names arguments. Server function called: mergeDS","code":""},{"path":"/reference/ds.merge.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Merges two data frames in the server-side — ds.merge","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.merge.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Merges two data frames in the server-side — ds.merge","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create two data frames with a common column ds.dataFrame(x = c(\"D$LAB_TSC\",\"D$LAB_TRIG\",\"D$LAB_HDL\",\"D$LAB_GLUC_ADJUSTED\"), completeCases = TRUE, newobj = \"df.x\", datasources = connections) ds.dataFrame(x = c(\"D$LAB_TSC\",\"D$GENDER\",\"D$PM_BMI_CATEGORICAL\",\"D$PM_BMI_CONTINUOUS\"), completeCases = TRUE, newobj = \"df.y\", datasources = connections) # Merge data frames using the common variable \"LAB_TSC\" ds.merge(x.name = \"df.x\", y.name = \"df.y\", by.x.names = \"df.x$LAB_TSC\", by.y.names = \"df.y$LAB_TSC\", all.x = TRUE, all.y = TRUE, sort = TRUE, suffixes = c(\".x\", \".y\"), no.dups = TRUE, newobj = \"df.merge\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.message.html","id":null,"dir":"Reference","previous_headings":"","what":"Returns server-side messages to the client-side — ds.message","title":"Returns server-side messages to the client-side — ds.message","text":"function allows error messages arising running server-side assign function returned client-side.","code":""},{"path":"/reference/ds.message.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Returns server-side messages to the client-side — ds.message","text":"","code":"ds.message(message.obj.name = NULL, datasources = NULL)"},{"path":"/reference/ds.message.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Returns server-side messages to the client-side — ds.message","text":"message.obj.name character string specifying name list contains message. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.message.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Returns server-side messages to the client-side — ds.message","text":"ds.message returns list object study, containing message written DataSHIELD $studysideMessage.","code":""},{"path":"/reference/ds.message.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Returns server-side messages to the client-side — ds.message","text":"Errors arising aggregate server-side functions can returned directly client-side. possible server-side assign functions designed specifically write objects server-side return meaningful information client-side. Otherwise, users may able use assign functions return disclosive output client-side. Server-side functions error messages made available designed able write designated error message $serversideMessage object list saved server-side primary output function. valid server-side functions DataSHIELD can write $studysideMessage. error message string exceed length nfilter.string default 80 characters. Server function called: messageDS","code":""},{"path":"/reference/ds.message.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Returns server-side messages to the client-side — ds.message","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.message.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Returns server-side messages to the client-side — ds.message","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Use a ds.asCharacter assign function to create the message in the server-side ds.asCharacter(x.name = \"D$LAB_TRIG\", newobj = \"vector1\", datasources = connections) #Return the message to the client-side ds.message(message.obj.name = \"vector1\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.metadata.html","id":null,"dir":"Reference","previous_headings":"","what":"Gets the metadata associated with a variable held on the server — ds.metadata","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"function gets metadata variable stored server.","code":""},{"path":"/reference/ds.metadata.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"","code":"ds.metadata(x = NULL, datasources = NULL)"},{"path":"/reference/ds.metadata.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"x character string specifying name object. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.metadata.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"ds.metadata returns client-side metadata associated object held server.","code":""},{"path":"/reference/ds.metadata.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"Server function metadataDS called examines attributes associated variable non-disclosive.","code":""},{"path":"/reference/ds.metadata.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"Stuart Wheater, DataSHIELD Development Team","code":""},{"path":"/reference/ds.metadata.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Gets the metadata associated with a variable held on the server — ds.metadata","text":"","code":"if (FALSE) { # \\dontrun{ # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Get the metadata associated with variable 'D' ds.metadata(x = 'D$LAB_TSC', datasources = connections) # clear the Datashield R sessions and logout DSI::datashield.logout(connections) } # }"},{"path":"/reference/ds.mice.html","id":null,"dir":"Reference","previous_headings":"","what":"Multivariate Imputation by Chained Equations — ds.mice","title":"Multivariate Imputation by Chained Equations — ds.mice","text":"function calls miceDS wrapper function mice mice R package. function creates multiple imputations (replacement values) multivariate missing data. method based Fully Conditional Specification, incomplete variable imputed separate model. MICE algorithm can impute mixes continuous, binary, unordered categorical ordered categorical data. addition, MICE can impute continuous two-level data, maintain consistency imputations means passive imputation. recommended imputation done datasource separately. Otherwise user make sure input data columns datasources order.","code":""},{"path":"/reference/ds.mice.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Multivariate Imputation by Chained Equations — ds.mice","text":"","code":"ds.mice( data = NULL, m = 5, maxit = 5, method = NULL, predictorMatrix = NULL, post = NULL, seed = NA, newobj_mids = NULL, newobj_df = NULL, datasources = NULL )"},{"path":"/reference/ds.mice.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Multivariate Imputation by Chained Equations — ds.mice","text":"data data frame matrix containing incomplete data. m Number multiple imputations. default m=5. maxit scalar giving number iterations. default 5. method Can either single string, vector strings length ncol(data), specifying imputation method used column data. specified single string, method used blocks. default imputation method (argument specified) depends measurement level target column, regulated defaultMethod argument native R mice function. Columns need imputed empty method \"\". predictorMatrix numeric matrix ncol(data) rows ncol(data) columns, containing 0/1 data specifying set predictors used target column. row corresponds variable imputed. value 1 means column variable used predictor target variables (rows). default, predictorMatrix square matrix ncol(data) rows columns 1's, except diagonal. post vector strings length ncol(data) specifying expressions strings. string parsed executed within sampler() function post-process imputed values iterations. default vector empty strings, indicating post-processing. Multivariate (block) imputation methods ignore post parameter. seed either NA (default) \"fixed\". seed set \"fixed\" fixed seed random number generator study-specific used. newobj_mids character string provides name output mids object stored data servers. Default mids_object. newobj_df character string provides name output dataframes stored data servers. Default imputationSet. example, m=5, newobj_df=\"imputationSet\", five imputed dataframes saved servers names imputationSet.1, imputationSet.2, imputationSet.3, imputationSet.4, imputationSet.5. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.mice.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Multivariate Imputation by Chained Equations — ds.mice","text":"list three elements: method, predictorMatrix post.","code":""},{"path":"/reference/ds.mice.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Multivariate Imputation by Chained Equations — ds.mice","text":"additional details see help header mice function native R mice package.","code":""},{"path":"/reference/ds.mice.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Multivariate Imputation by Chained Equations — ds.mice","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.names.html","id":null,"dir":"Reference","previous_headings":"","what":"Return the names of a list object — ds.names","title":"Return the names of a list object — ds.names","text":"Returns names designated server-side list","code":""},{"path":"/reference/ds.names.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Return the names of a list object — ds.names","text":"","code":"ds.names(xname = NULL, datasources = NULL)"},{"path":"/reference/ds.names.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Return the names of a list object — ds.names","text":"xname character string specifying name list. datasources list DSConnection-class objects obtained login represent particular data sources (studies) addressed function call. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.names.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Return the names of a list object — ds.names","text":"ds.names returns client-side names list object stored server-side.","code":""},{"path":"/reference/ds.names.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Return the names of a list object — ds.names","text":"ds.names calls aggregate function namesDS. function similar native R function names subsume functionality, example, works extract names already exist, create new names objects. function restricted objects type list, includes objects primary class list return TRUE native R function .list. example includes multi-component object created fitting generalized linear model using ds.glmSLMA. resultant object saved server separately formally class \"glm\" \"ls\" responds TRUE .list(),","code":""},{"path":"/reference/ds.names.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Return the names of a list object — ds.names","text":"Amadou Gaye, updated Paul Burton DataSHIELD development team 25/06/2020 Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.names.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Return the names of a list object — ds.names","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create a list in the server-side ds.asList(x.name = \"D\", newobj = \"D.list\", datasources = connections) #Get the names of the list ds.names(xname = \"D.list\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.ns.html","id":null,"dir":"Reference","previous_headings":"","what":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","title":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","text":"function based native R function ns splines package. function generate B-spline basis matrix natural cubic spline.","code":""},{"path":"/reference/ds.ns.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","text":"","code":"ds.ns( x, df = NULL, knots = NULL, intercept = FALSE, Boundary.knots = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.ns.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","text":"x predictor variable. Missing values allowed. df degrees freedom. One can supply df rather knots; ns() chooses df - 1 - intercept knots suitably chosen quantiles x (ignore missing values). default, df = NULL, sets number inner knots length(knots). knots breakpoints define spline. default knots; together natural boundary conditions results basis linear regression x. Typical values mean median one knot, quantiles knots. See also Boundary.knots. intercept TRUE, intercept included basis; default FALSE. Boundary.knots boundary points impose natural boundary conditions anchor B-spline basis (default range data). knots Boundary.knots supplied, basis parameters depend x. Data can extend beyond Boundary.knots. newobj character string provides name output variable stored data servers. Default ns.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.ns.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","text":"matrix dimension length(x) * df either df supplied knots supplied, df = length(knots) + 1 + intercept. Attributes returned correspond arguments ns, explicitly give knots, Boundary.knots etc use predict.ns(). object assigned serverside.","code":""},{"path":"/reference/ds.ns.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","text":"ns native R based function splineDesign. generates basis matrix representing family piecewise-cubic splines specified sequence interior knots, natural boundary conditions. enforce constraint function linear beyond boundary knots, can either supplied default extremes data. primary use modelling formula directly specify natural spline term model.","code":""},{"path":"/reference/ds.ns.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generate a Basis Matrix for Natural Cubic Splines — ds.ns","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.numNA.html","id":null,"dir":"Reference","previous_headings":"","what":"Gets the number of missing values in a server-side vector — ds.numNA","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"function helps know number missing values vector stored server-side.","code":""},{"path":"/reference/ds.numNA.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"","code":"ds.numNA(x = NULL, datasources = NULL, classConsistencyCheck = TRUE)"},{"path":"/reference/ds.numNA.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"x character string specifying name vector. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default TRUE.","code":""},{"path":"/reference/ds.numNA.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"ds.numNA returns client-side number missing values server-side vector.","code":""},{"path":"/reference/ds.numNA.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"number missing entries counted total study returned. Server function called: numNaDS","code":""},{"path":"/reference/ds.numNA.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.numNA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Gets the number of missing values in a server-side vector — ds.numNA","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Get the number of missing values on a server-side vector ds.numNA(x = \"D$LAB_TSC\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.qlspline.html","id":null,"dir":"Reference","previous_headings":"","what":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","text":"function based native R function qlspline lspline package. function computes basis piecewise-linear spline , depending argument marginal, coefficients can interpreted (1) slopes consecutive spline segments, (2) slope change consecutive knots.","code":""},{"path":"/reference/ds.qlspline.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","text":"","code":"ds.qlspline( x, q, na.rm = TRUE, marginal = FALSE, names = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.qlspline.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","text":"x name input numeric variable q numeric, single scalar greater equal 2 number equal-frequency intervals along x vector numbers (0; 1) specifying quantiles explicitly. na.rm logical, whether NA removed calculating quantiles, passed na.rm quantile. Default set TRUE marginal logical, parametrise spline, see Details names character, vector names constructed variables newobj character string provides name output variable stored data servers. Default qlspline.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.qlspline.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","text":"object class \"lspline\" \"matrix\", name specified newobj argument (default name \"qlspline.newobj\"), assigned serverside.","code":""},{"path":"/reference/ds.qlspline.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","text":"marginal FALSE (default) coefficients spline correspond slopes consecutive segments. TRUE first coefficient correspond slope first segment. consecutive coefficients correspond change slope compared previous segment. Function qlspline wraps lspline calculates knot positions quantiles x. q numerical scalar greater equal 2, quantiles computed seq(0, 1, length.= q + 1)[-c(1, q+1)], .e. knots q-tiles distribution x. Alternatively, q can vector values [0; 1] specifying quantile probabilities directly (vector passed argument probs quantile).","code":""},{"path":"/reference/ds.qlspline.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Basis for a piecewise linear spline with meaningful coefficients — ds.qlspline","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/ds.quantileMean.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the quantiles of a server-side variable — ds.quantileMean","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"function calculates mean quantile values server-side quantitative variable.","code":""},{"path":"/reference/ds.quantileMean.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"","code":"ds.quantileMean( x = NULL, type = \"combine\", datasources = NULL, classConsistencyCheck = FALSE )"},{"path":"/reference/ds.quantileMean.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"x character string specifying name numeric vector. type character represents type graph display. can set 'combine' 'split'. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default FALSE.","code":""},{"path":"/reference/ds.quantileMean.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"ds.quantileMean returns client-side quantiles statistical mean server-side numeric vector.","code":""},{"path":"/reference/ds.quantileMean.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"function return minimum maximum values potentially disclosive. Depending argument type can carried two types analysis: (1) type = 'combine' pooled values displayed (2) type = 'split' summaries returned study. Server functions called: quantileMeanDS, length numNaDS","code":""},{"path":[]},{"path":"/reference/ds.quantileMean.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.quantileMean.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the quantiles of a server-side variable — ds.quantileMean","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Get the quantiles and mean of a server-side variable ds.quantileMean(x = \"D$LAB_TRIG\", type = \"combine\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rBinom.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates Binomial distribution in the server-side — ds.rBinom","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"Generates random (pseudorandom) non-negative integers Binomial distribution. Also, ds.rBinom allows creating different vector lengths server.","code":""},{"path":"/reference/ds.rBinom.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"","code":"ds.rBinom( samp.size = 1, size = 0, prob = 1, newobj = NULL, seed.as.integer = NULL, return.full.seed.as.set = FALSE, datasources = NULL )"},{"path":"/reference/ds.rBinom.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"samp.size integer value integer vector defines length random numeric vector created source. size positive integer specifies number Bernoulli trials. prob numeric scalar value vector range 0 > prob > 1 specifies probability positive response (.e. 1 rather 0). newobj character string provides name output variable stored data servers. Default rbinom.newobj. seed..integer integer NULL value provides random seed data source. return.full.seed..set logical, TRUE return full random number seed data source (numeric vector length 626). FALSE return trigger seed value provided. Default FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rBinom.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"ds.rBinom returns random number vectors Binomial distribution study, taking account values specified parameter function. output vector written server-side. requested, also returned client-side full 626 lengths random seed vector generated source (see info argument return.full.seed..set).","code":""},{"path":"/reference/ds.rBinom.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"Creates vector random pseudorandom non-negative integer values distributed Binomial distribution. ds.rBinom function's arguments specify number trials, success probability, length seed output vector source. specify different size source, can use character vector (..., size=\"vector..sizes\"...) datasources parameter create random vector one source time, changing size required. default value size = 1 simulates binary outcomes (observations 0 1). specify different prob source, can use integer character vector (..., prob=\"vector..probs\"...) datasources parameter create random vector one source time, changing prob required. seed..integer integer e.g. 5 one source (N) seed set 5*N. example, first study seed set 938*1, second 938*2 938*N Nth study. seed..integer set 0 sources start seed value 0 random number generators , therefore, start position. Besides, use starting seed studies wish 0, can use datasources argument generate random number vectors one source time. Server functions called: rBinomDS setSeedDS.","code":""},{"path":"/reference/ds.rBinom.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rBinom.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates Binomial distribution in the server-side — ds.rBinom","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Generating the vectors in the Opal servers ds.rBinom(samp.size=c(13,20,25), #the length of the vector created in each source is different size=as.character(c(10,23,5)), #Bernoulli trials change in each source prob=c(0.6,0.1,0.5), #Probability changes in each source newobj=\"Binom.dist\", seed.as.integer=45, return.full.seed.as.set=FALSE, datasources=connections) #all the Opal servers are used, in this case 3 #(see above the connection to the servers) ds.rBinom(samp.size=15, size=4, prob=0.7, newobj=\"Binom.dist\", seed.as.integer=324, return.full.seed.as.set=FALSE, datasources=connections[2]) #only the second Opal server is used (\"study2\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rNorm.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates Normal distribution in the server-side — ds.rNorm","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"Generates normally distributed random (pseudorandom) scalar numbers. Besides, ds.rNorm allows creating different vector lengths server.","code":""},{"path":"/reference/ds.rNorm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"","code":"ds.rNorm( samp.size = 1, mean = 0, sd = 1, newobj = \"newObject\", seed.as.integer = NULL, return.full.seed.as.set = FALSE, force.output.to.k.decimal.places = 9, datasources = NULL )"},{"path":"/reference/ds.rNorm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"samp.size integer value integer vector defines length random numeric vector created source. mean mean value vector Normal distribution created. sd standard deviation Normal distribution created. newobj character string provides name output variable stored data servers. Default newObject. seed..integer integer NULL value provides random seed data source. return.full.seed..set logical, TRUE returns full random number seed data source (numeric vector length 626). FALSE return trigger seed value provided. Default FALSE. force.output..k.decimal.places integer vector forces output random numbers vector k decimals. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rNorm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"ds.rNorm returns random number vectors normal distribution study, taking account values specified parameter function. output vector written server-side. requested, also returned client-side full 626 lengths random seed vector generated source (see info argument return.full.seed..set).","code":""},{"path":"/reference/ds.rNorm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"Creates vector pseudorandom numbers distributed Normal distribution data source. ds.rNorm function's arguments specify mean standard deviation (sd) normal distribution length seed output vector source. specify different mean value source, can use character vector (..., mean=\"vector..means\"...) datasources parameter create random vector one source time, changing mean required. Default value mean = 0. specify different sd value source, can use character vector (..., sd=\"vector..sds\"... datasources parameter create random vector one source time, changing required. Default value sd = 0. seed..integer integer e.g. 5 one source (N) seed set 5*N. example, first study seed set 938*1, second 938*2 938*N Nth study. seed..integer set 0 sources start seed value 0 random number generators , therefore, start position. Also, use starting seed studies wish 0, can use datasources argument generate random number vectors one source time. force.output..k.decimal.places range k 1-8 decimals. k = 0 output random numbers forced integer. k = 9, rounding output numbers occurs. default value force.output..k.decimal.places = 9. Server functions called: rNormDS setSeedDS.","code":""},{"path":"/reference/ds.rNorm.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rNorm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates Normal distribution in the server-side — ds.rNorm","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Generating the vectors in the Opal servers ds.rNorm(samp.size=c(10,20,45), #the length of the vector created in each source is different mean=c(1,6,4), #the mean of the Normal distribution changes in each server sd=as.character(c(1,4,3)), #the sd of the Normal distribution changes in each server newobj=\"Norm.dist\", seed.as.integer=2345, return.full.seed.as.set=FALSE, force.output.to.k.decimal.places=c(4,5,6), #output random numbers have different #decimal quantity in each source datasources=connections) #all the Opal servers are used, in this case 3 #(see above the connection to the servers) ds.rNorm(samp.size=10, mean=1.4, sd=0.2, newobj=\"Norm.dist\", seed.as.integer=2345, return.full.seed.as.set=FALSE, force.output.to.k.decimal.places=1, datasources=connections[2]) #only the second Opal server is used (\"study2\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rPois.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates Poisson distribution in the server-side — ds.rPois","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"Generates random (pseudorandom) non-negative integers Poisson distribution. Besides, ds.rPois allows creating different vector lengths server.","code":""},{"path":"/reference/ds.rPois.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"","code":"ds.rPois( samp.size = 1, lambda = 1, newobj = \"newObject\", seed.as.integer = NULL, return.full.seed.as.set = FALSE, datasources = NULL )"},{"path":"/reference/ds.rPois.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"samp.size integer value integer vector defines length random numeric vector created source. lambda number events mean per interval. newobj character string provides name output variable stored data servers. Default newObject. seed..integer integer NULL value provides random seed data source. return.full.seed..set logical, TRUE return full random number seed data source (numeric vector length 626). FALSE return trigger seed value provided. Default FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rPois.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"ds.rPois returns random number vectors Poisson distribution study, taking account values specified parameter function. created vectors stored server-side. requested, also returned client-side full 626 lengths random seed vector generated source (see info argument return.full.seed..set).","code":""},{"path":"/reference/ds.rPois.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"Creates vector random pseudorandom non-negative integer values distributed Poisson distribution data source. ds.rPois function's arguments specify lambda, length seed output vector source. specify different lambda value source, can use character vector (..., lambda = \"vector..lambdas\"...) datasources parameter create random vector one source time, changing lambda required. Default value lambda> = 1. seed..integer integer e.g. 5 one source (N) seed set 5*N. example, first study seed set 938*1, second 938*2 938*N Nth study. seed..integer set 0 sources start seed value 0 random number generators , therefore, start position. Also, use starting seed studies wish 0, can use datasources argument generate random number vectors one source time. Server functions called: rPoisDS setSeedDS.","code":""},{"path":"/reference/ds.rPois.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rPois.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates Poisson distribution in the server-side — ds.rPois","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Generating the vectors in the Opal servers ds.rPois(samp.size=c(13,20,25), #the length of the vector created in each source is different lambda=as.character(c(2,3,4)), #different mean per interval (2,3,4) in each source newobj=\"Pois.dist\", seed.as.integer=1234, return.full.seed.as.set=FALSE, datasources=connections) #all the Opal servers are used, in this case 3 #(see above the connection to the servers) ds.rPois(samp.size=13, lambda=5, newobj=\"Pois.dist\", seed.as.integer=1234, return.full.seed.as.set=FALSE, datasources=connections[1]) #only the first Opal server is used (\"study1\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rUnif.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates Uniform distribution in the server-side — ds.rUnif","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"Generates uniformly distributed random (pseudorandom) scalar numbers. Besides, ds.rUnif allows creating different vector lengths server.","code":""},{"path":"/reference/ds.rUnif.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"","code":"ds.rUnif( samp.size = 1, min = 0, max = 1, newobj = \"newObject\", seed.as.integer = NULL, return.full.seed.as.set = FALSE, force.output.to.k.decimal.places = 9, datasources = NULL )"},{"path":"/reference/ds.rUnif.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"samp.size integer value integer vector defines length random numeric vector created source. min numeric scalar specifies minimum value random numbers distribution. max numeric scalar specifies maximum value random numbers distribution. newobj character string provides name output variable stored data servers. Default newObject. seed..integer integer NULL value provides random seed data source. return.full.seed..set logical, TRUE return full random number seed data source (numeric vector length 626). FALSE return trigger seed value provided. Default FALSE. force.output..k.decimal.places integer integer vector forces output random numbers vector k decimals. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rUnif.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"ds.Unif returns random number vectors uniform distribution study, taking account values specified parameter function. created vectors stored server-side. requested, also returned client-side full 626 lengths random seed vector generated source (see info argument return.full.seed..set).","code":""},{"path":"/reference/ds.rUnif.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"creates vector pseudorandom numbers distributed uniform probability data source. ds.Unif function's arguments specify minimum maximum uniform distribution length seed output vector source. specify different min values source, can use character vector (..., min=\"vector..mins\"...) datasources parameter create random vector one source time, changing min value required. Default value min = 0. specify different max values source, can use character vector (..., max=\"vector..maxs\"...) datasources parameter create random vector one source time, changing max value required. Default value max = 1. seed..integer integer e.g. 5 one source (N) seed set 5*N. example, first study seed set 938*1, second 938*2 938*N Nth study. seed..integer set 0 sources start seed value 0 random number generators , therefore, start position. Also, use starting seed studies wish 0, can use datasources argument generate random number vectors one source time. force.output..k.decimal.places range k 1-8 decimals. k = 0 output random numbers forced integer. k = 9, rounding output numbers occurs. default value force.output..k.decimal.places = 9. wish generate integers equal probabilities range 1-10 specify min = 0.5 max = 10.5. Default value k = 9. Server functions called: rUnifDS setSeedDS.","code":""},{"path":"/reference/ds.rUnif.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rUnif.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates Uniform distribution in the server-side — ds.rUnif","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Generating the vectors in the Opal servers ds.rUnif(samp.size = c(12,20,4), #the length of the vector created in each source is different min = as.character(c(0,2,5)), #different minumum value of the function in each source max = as.character(c(2,5,9)), #different maximum value of the function in each source newobj = \"Unif.dist\", seed.as.integer = 234, return.full.seed.as.set = FALSE, force.output.to.k.decimal.places = c(1,2,3), datasources = connections) #all the Opal servers are used, in this case 3 #(see above the connection to the servers) ds.rUnif(samp.size = 12, min = 0, max = 2, newobj = \"Unif.dist\", seed.as.integer = 12345, return.full.seed.as.set = FALSE, force.output.to.k.decimal.places = 2, datasources = connections[2]) #only the second Opal server is used (\"study2\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rbind.html","id":null,"dir":"Reference","previous_headings":"","what":"Combines R objects by rows in the server-side — ds.rbind","title":"Combines R objects by rows in the server-side — ds.rbind","text":"takes sequence vector, matrix data-frame arguments combines rows produce matrix.","code":""},{"path":"/reference/ds.rbind.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Combines R objects by rows in the server-side — ds.rbind","text":"","code":"ds.rbind( x = NULL, DataSHIELD.checks = FALSE, force.colnames = NULL, newobj = NULL, datasources = NULL, notify.of.progress = FALSE )"},{"path":"/reference/ds.rbind.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Combines R objects by rows in the server-side — ds.rbind","text":"x character vector name objects combined. DataSHIELD.checks logical, TRUE checks input objects exist appropriate class. force.colnames can NULL vector characters specifies column names output object. newobj character string provides name output variable stored data servers. Defaults rbind.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. notify..progress specifies console output produced indicate progress. Default FALSE.","code":""},{"path":"/reference/ds.rbind.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Combines R objects by rows in the server-side — ds.rbind","text":"ds.rbind returns matrix combining rows R objects specified function written server-side. also returns two messages client-side name newobj created data source DataSHIELD.checks result.","code":""},{"path":"/reference/ds.rbind.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Combines R objects by rows in the server-side — ds.rbind","text":"sequence vector, matrix data-frame arguments combined rows produce matrix server-side. DataSHIELD.checks checks relatively slow. Default DataSHIELD.checks value FALSE. force.colnames NULL column names inferred names column names first object specified x argument. vector column names must number elements columns output object. Server functions called: rbindDS.","code":""},{"path":"/reference/ds.rbind.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Combines R objects by rows in the server-side — ds.rbind","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rbind.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Combines R objects by rows in the server-side — ds.rbind","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Combining R objects by rows ds.rbind(x = \"D\", #data frames in the server-side to be conbined #(see above the connection to the Opal servers) DataSHIELD.checks = FALSE, force.colnames = NULL, newobj = \"D.rbind\", # name for the output object that is stored in the data servers datasources = connections, # All Opal servers are used #(see above the connection to the Opal servers) notify.of.progress = FALSE) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.reShape.html","id":null,"dir":"Reference","previous_headings":"","what":"Reshapes server-side grouped data — ds.reShape","title":"Reshapes server-side grouped data — ds.reShape","text":"Reshapes data frame containing longitudinal otherwise grouped data 'wide' 'long' format vice-versa.","code":""},{"path":"/reference/ds.reShape.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Reshapes server-side grouped data — ds.reShape","text":"","code":"ds.reShape( data.name = NULL, varying = NULL, v.names = NULL, timevar.name = \"time\", idvar.name = \"id\", drop = NULL, direction = NULL, sep = \".\", newobj = \"newObject\", datasources = NULL )"},{"path":"/reference/ds.reShape.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Reshapes server-side grouped data — ds.reShape","text":"data.name character string specifying name data frame reshaped. varying names sets variables wide format correspond single variables 'long' format. v.names names variables 'long' format correspond multiple variables 'wide' format. timevar.name variable 'long' format differentiates multiple records group individual. one record matches, first taken. idvar.name names one variables 'long' format identify multiple records group/individual. variables may also present 'wide' format. drop vector names variables drop reshaping. can simplify resultant output. direction character string partially matched either 'wide' reshape 'long' 'wide' format, 'long' reshape 'wide' 'long' format. sep character vector length 1, indicating separating character variable names 'wide' format. used creating good v.names times arguments based names varying argument. also used create variable names reshaping 'wide' format. newobj character string provides name output object stored data servers. Default reshape.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.reShape.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Reshapes server-side grouped data — ds.reShape","text":"ds.reShape returns server-side reshaped data frame converted 'long' 'wide' format 'wide' long' format. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.reShape.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Reshapes server-side grouped data — ds.reShape","text":"function based native R function reshape. reshapes data frame containing longitudinal otherwise grouped data 'wide' format repeated measurements separate columns record 'long' format repeated measurements separate records. reshaping can either direction. Server function called: reShapeDS","code":""},{"path":"/reference/ds.reShape.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Reshapes server-side grouped data — ds.reShape","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.reShape.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Reshapes server-side grouped data — ds.reShape","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"SURVIVAL.EXPAND_NO_MISSING3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Reshape server-side grouped data ds.reShape(data.name = \"D\", v.names = \"age.60\", timevar.name = \"time.id\", idvar.name = \"id\", direction = \"wide\", newobj = \"reshape1_obj\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.recodeLevels.html","id":null,"dir":"Reference","previous_headings":"","what":"Recodes the levels of a server-side factor vector — ds.recodeLevels","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"function replaces levels factor specified new ones.","code":""},{"path":"/reference/ds.recodeLevels.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"","code":"ds.recodeLevels( x = NULL, newCategories = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.recodeLevels.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"x character string specifying name factor variable. newCategories character vector specifying new levels. length must equal greater current number levels. newobj character string provides name output object stored data servers. Default recodelevels.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.recodeLevels.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"ds.recodeLevels returns server-side variable type factor replaces levels.","code":""},{"path":"/reference/ds.recodeLevels.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"function similar native R function levels(). can example used merge two classes one, add level(s) vector rename (.e. re-label) levels vector. Server function called: levels()","code":""},{"path":"/reference/ds.recodeLevels.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.recodeLevels.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Recodes the levels of a server-side factor vector — ds.recodeLevels","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Recode the levels of a factor variable ds.recodeLevels(x = \"D$PM_BMI_CATEGORICAL\", newCategories = c(\"1\",\"2\",\"3\"), newobj = \"BMI_CAT\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.recodeValues.html","id":null,"dir":"Reference","previous_headings":"","what":"Recodes server-side variable values — ds.recodeValues","title":"Recodes server-side variable values — ds.recodeValues","text":"function takes specified values elements vector converts matched set alternative specified values.","code":""},{"path":"/reference/ds.recodeValues.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recodes server-side variable values — ds.recodeValues","text":"","code":"ds.recodeValues( var.name = NULL, values2replace.vector = NULL, new.values.vector = NULL, missing = NULL, newobj = NULL, datasources = NULL, notify.of.progress = FALSE )"},{"path":"/reference/ds.recodeValues.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recodes server-side variable values — ds.recodeValues","text":"var.name character string providing name variable recoded. values2replace.vector numeric character vector specifying values variable var.name replaced. new.values.vector numeric character vector specifying new values. missing supplied, missing values var.name replaced value. Must length 1. analyst want recode missing values also specify identical vector values arguments values2replace.vector new.values.vector. Otherwise please look ds.replaceNA function. newobj character string provides name output object stored data servers. Default recodevalues.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. notify..progress logical. TRUE console output produced indicate progress. Default FALSE.","code":""},{"path":"/reference/ds.recodeValues.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recodes server-side variable values — ds.recodeValues","text":"Assigns server new variable recoded values. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.recodeValues.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Recodes server-side variable values — ds.recodeValues","text":"function recodes individual values new individual values. can apply numeric character values, factor levels NAs. One particular use ds.recodeValues convert NAs explicit value. value specified argument missing. user want recode missing values, also specify identical vector values arguments values2replace.vector new.values.vector (see Example 2 ). Server function called: recodeValuesDS","code":""},{"path":"/reference/ds.recodeValues.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Recodes server-side variable values — ds.recodeValues","text":"DataSHIELD Development Team","code":""},{"path":[]},{"path":"/reference/ds.rep.html","id":null,"dir":"Reference","previous_headings":"","what":"Creates a repetitive sequence in the server-side — ds.rep","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"Creates repetitive sequence repeating specified scalar number, vector list data source.","code":""},{"path":"/reference/ds.rep.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"","code":"ds.rep( x1 = NULL, times = NA, length.out = NA, each = 1, source.x1 = \"clientside\", source.times = NULL, source.length.out = NULL, source.each = NULL, x1.includes.characters = FALSE, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.rep.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"x1 scalar number, vector list. times integer clientside serverside integer vector. length.clientside integer serverside integer vector. clientside serverside integer. source.x1 source x1 argument. can \"clientside\" \"c\" serverside \"s\". source.times see source.x1 source.length.see source.x1 source.see source.x1 x1.includes.characters Boolean parameter specifies x1 character. newobj character string provides name output object stored data servers. Default seq.vect. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rep.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"ds.rep returns server-side vector specified repetitive sequence. Also, two validity messages returned client-side name newobj created data source valid form.","code":""},{"path":"/reference/ds.rep.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"arguments can denote clientside serverside (.e. x1, times, length.). Server function called: repDS.","code":""},{"path":"/reference/ds.rep.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rep.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Creates a repetitive sequence in the server-side — ds.rep","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Creating a repetitive sequence ds.rep(x1 = 4, times = 6, length.out = NA, each = 1, source.x1 = \"clientside\", source.times = \"c\", source.length.out = NULL, source.each = \"c\", x1.includes.characters = FALSE, newobj = \"rep.seq\", datasources = connections) ds.rep(x1 = \"lung\", times = 6, length.out = 7, each = 1, source.x1 = \"clientside\", source.times = \"c\", source.length.out = \"c\", source.each = \"c\", x1.includes.characters = TRUE, newobj = \"rep.seq\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.replaceNA.html","id":null,"dir":"Reference","previous_headings":"","what":"Replaces the missing values in a server-side vector — ds.replaceNA","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"function identifies missing values replaces value values specified analyst.","code":""},{"path":"/reference/ds.replaceNA.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"","code":"ds.replaceNA(x = NULL, forNA = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.replaceNA.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"x character string specifying name vector. forNA list vector contains replacement value(s), study. length list vector must equal number servers (studies). newobj character string provides name output object stored data servers. Default replacena.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.replaceNA.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"ds.replaceNA returns server-side new vector table structure missing values replaced specified values. class vector initial vector.","code":""},{"path":"/reference/ds.replaceNA.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"function used analyst prefers requires complete vectors. possible specify one value missing value first returning number missing values using function ds.numNA cases, might sensible replace missing values one specific value e.g. replace missing values vector mean median value. missing values replaced new vector created. Note: vector within table structure data frame new vector appended table structure table holds vector without missing values. Server function called: replaceNaDS","code":""},{"path":"/reference/ds.replaceNA.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.replaceNA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Replaces the missing values in a server-side vector — ds.replaceNA","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Replace missing values in variable 'LAB_HDL' by the mean value # in each study # Get the mean value of 'LAB_HDL' for each study mean <- ds.mean(x = \"D$LAB_HDL\", type = \"split\", datasources = connections) # Replace the missing values using the mean for each study ds.replaceNA(x = \"D$LAB_HDL\", forNA = list(mean[[1]][1], mean[[1]][2], mean[[1]][3]), newobj = \"HDL.noNA\", datasources = connections) # Example 2: Replace missing values in categorical variable 'PM_BMI_CATEGORICAL' # with 999s # First check how many NAs there are in 'PM_BMI_CATEGORICAL' in each study ds.table(rvar = \"D$PM_BMI_CATEGORICAL\", useNA = \"always\") # Replace the missing values with 999s ds.replaceNA(x = \"D$PM_BMI_CATEGORICAL\", forNA = c(999,999,999), newobj = \"bmi999\") # Check if the NAs have been replaced correctly ds.table(rvar = \"bmi999\", useNA = \"always\") # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rm.html","id":null,"dir":"Reference","previous_headings":"","what":"Deletes server-side R objects — ds.rm","title":"Deletes server-side R objects — ds.rm","text":"deletes R objects server-side","code":""},{"path":"/reference/ds.rm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Deletes server-side R objects — ds.rm","text":"","code":"ds.rm(x.names = NULL, datasources = NULL)"},{"path":"/reference/ds.rm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Deletes server-side R objects — ds.rm","text":"x.names character string specifying objects deleted. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Deletes server-side R objects — ds.rm","text":"ds.rm function deletes server-side specified object. successful message \"Object(s) '' deleted.\" returned client-side.","code":""},{"path":"/reference/ds.rm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Deletes server-side R objects — ds.rm","text":"function similar native R function rm(). fact aggregate function may surprising modifies object server-side, , therefore, expected assign function. However, assign function last step running write modified object newobj. fail effect function delete object impossible write anywhere. Please note although calls aggregate function type argument. Server function called: rmDS","code":""},{"path":"/reference/ds.rm.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Deletes server-side R objects — ds.rm","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.rm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Deletes server-side R objects — ds.rm","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create an object in the server-side ds.assign(toAssign = \"D$LAB_TSC\", newobj = \"labtsc\", datasources = connections) #Delete \"labtsc\" object from the server-side ds.rm(x.names = \"labtsc\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.rowColCalc.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"Computes sums means rows columns numeric matrix data frame server-side.","code":""},{"path":"/reference/ds.rowColCalc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"","code":"ds.rowColCalc(x = NULL, operation = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.rowColCalc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"x character string specifying name matrix data frame. operation character string indicates operation carry : \"rowSums\", \"colSums\", \"rowMeans\" \"colMeans\". newobj character string provides name output variable stored data servers. Default rowcolcalc.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.rowColCalc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"ds.rowColCalc returns server-side rows columns sums means.","code":""},{"path":"/reference/ds.rowColCalc.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"function similar R base functions rowSums, colSums, rowMeans colMeans restrictions. results calculation returned user potentially revealing .e. number rows less allowed number observations. Server functions called: classDS, dimDS colnamesDS","code":""},{"path":"/reference/ds.rowColCalc.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.rowColCalc.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes rows and columns sums and means in the server-side — ds.rowColCalc","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() myvar <- list(\"LAB_TSC\",\"LAB_HDL\") # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, variables = myvar, symbol = \"D\") #Calculate the colSums ds.rowColCalc(x = \"D\", operation = \"colSums\", newobj = \"D.rowSums\", datasources = connections) #Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.sample.html","id":null,"dir":"Reference","previous_headings":"","what":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","title":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","text":"draws pseudorandom sample vector, dataframe matrix serverside - special case - randomly permutes vector, dataframe matrix.","code":""},{"path":"/reference/ds.sample.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","text":"","code":"ds.sample( x = NULL, size = NULL, seed.as.integer = NULL, replace = FALSE, prob = NULL, newobj = NULL, datasources = NULL, notify.of.progress = FALSE )"},{"path":"/reference/ds.sample.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","text":"x Either character string providing name serverside vector, matrix data.frame sampled permuted, integer/numeric scalar (e.g. 923) indicating one create new vector serverside randomly permuted sample vector 1:923, ([replace] = FALSE, full random permutation vector. details using ds.sample x set integer/numeric please see help sample function native R. x set character string denoting vector, matrix data.frame serverside, please note although ds.sample effectively calls sample serverside behaves somewhat differently sample - reasons identified top 'details' help sample used guide . size numeric/integer scalar indicating size sample drawn. [x] argument vector, matrix data.frame serverside [size] argument set either 0 length object 'sampled' [replace] FALSE, ds.sample draw random sample includes rows input object randomly permute . [x] argument numeric (e.g. 923) size either undefined set equal 923, output serverside vector length 923 permuted random order. [replace] argument FALSE value [size] must greater length object sorted - violated error message returned. seed..integer precisely equivalent [seed..integer] arguments pseudo-random number generating functions (e.g. also see help ds.rBinom, ds.rNorm, ds.rPois ds.rUnif). words seed..integer argument either numeric scalar NULL primes random seed data source. numeric scalar (e.g. 938) seed study set 938*1 first study set data sources used, 938*2 second, 938*N Nth study. set 0 sources start seed value 0 random number generators therefore start position. want use starting seed studies wish 0, can specify non-zero scalar value use argument generate random number vectors one source time (e.g. ,datasources=default.opals[2] generate random vector source 2). example, value 78326 seed source set 78326*1 = 78326 vector datasources used call function always length 1 source-specific seed multiplier also 1. function ds.rUnif.o calls serverside assign function setSeedDS.o create random seeds source replace Boolean indicator (TRUE FALSE) specifying whether sample drawn without replacement. Default FALSE sample drawn without replacement. details see help sample native R. prob character string containing name numeric vector probability weights serverside associated elements vector sampled enabling drawing sample elements given higher probability drawn others. details see help sample native R. newobj character string providing name output data.frame defaults 'newobj.sample' name specified. datasources specifies particular opal object(s) use. argument specified default set opals used. default opals called default.opals default can set using function ds.setDefaultOpals. specified, set without inverted commas: e.g. datasources=opals.em datasources=default.opals. wish apply function solely e.g. second opal server set three, argument can specified : e.g. datasources=opals.em[2]. wish specify first third opal servers set specify: e.g. datasources=opals.em[c(1,3)] notify..progress specifies console output produce indicate progress. default value notify..progress FALSE.","code":""},{"path":"/reference/ds.sample.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","text":"object specified argument (default name 'newobj.sample') written serverside. addition, two validity messages returned indicating whether created data source whether valid form. form valid least one study - e.g. disclosure trap tripped creation full output object blocked - ds.dataFrameSort() also returns studysideMessages may explain error creating full output object. currently working extend information can returned clientside error occurs.","code":""},{"path":"/reference/ds.sample.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","text":"Clientside function ds.sample calls serverside assign function sampleDS. Based native R function sample() deals slightly differently data.frames matrices. Specifically sample() function R identifies length object samples n components length. length(data.frame) native R returns number columns number rows. data.frame 71 rows 10 columns, sample() function select 10 columns random, often required. , ds.sample(x=\"data.frame\",size=10) DataSHIELD sample 10 rows random(without replacement depending whether [replace] argument TRUE FALSE, False default). x simple vector matrix first coerced data.frame serverside dealt way (.e. random selection 10 rows). x integer expressed character string, dealt exactly way native R. , x = 923 size=117, DataSHIELD draw random sample random order size 117 vector 1:923 (.e. 1, 2, ... ,923) without replacement depending whether [replace] TRUE FALSE. [x] argument numeric (e.g. 923) size either undefined set equal 923, output serverside vector length 923 permuted random order. [x] argument vector, matrix data.frame serverside [size] argument set either 0 length object 'sampled' [replace] FALSE, ds.sample draw random sample includes rows input object randomly permute . ds.sample enables random permuting well random sub-sampling. serverside vector, matrix data.frame sampled using ds.sample 3 new columns appended right output object. : '.sample', 'ID.seq', 'sampling.order'. first set 1 whenever row enters sample QA test, values column output object 1. 'ID.seq' sequential numeric ID appended right object sampled running ds.sample runs 1 length object appended even already equivalent sequential ID object. output object stored original order sampling, first four elements 'ID.seq' 3,4, 6, 15 ... means rows 1 2 included random sample, rows 3, 4 . Row 5 included, 6 included rows 7-14 etc. 'sampling.order' vector class numeric indicates order rows entered sample: 1 indicates first row sample, 2 second etc. lines code follow create output object length input object (PRWa) join sample random order. sorting output object (case default name 'newobj.sample) using ds.dataFrameSort 'sampling.order' vector sort key, output object rendered equivalent PRWa rows randomly permuted (column reflecting vector 'sample.order' now runs 1:length object, column reflecting 'ID.seq' denoting original order now randomly ordered. need return original order can simply us ds.dataFrameSort using column reflecting 'ID.seq' sort key: (1) ds.sample('PRWa',size=0,seed..integer = 256); (2) ds.make(\"newobj.sample$sampling.order\",\"sortkey\"); (3) ds.dataFrameSort(\"newobj.sample\",\"sortkey\",newobj=\"newobj.permuted\") additional detail note original name sort key (\"newobj.sample$sampling.order\") 28 characters long, length tested check disclosure risk, original name fail using usual value 'nfilter.stringShort' (.e. 20). line 2 inserted create copy shorter name.","code":""},{"path":"/reference/ds.sample.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Performs random sampling and permuting of vectors, dataframes and matrices — ds.sample","text":"Paul Burton, DataSHIELD Development Team, 15/4/2020","code":""},{"path":"/reference/ds.scatterPlot.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates non-disclosive scatter plots — ds.scatterPlot","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"function uses two disclosure control methods generate non-disclosive scatter plots two server-side continuous variables.","code":""},{"path":"/reference/ds.scatterPlot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"","code":"ds.scatterPlot( x = NULL, y = NULL, method = \"deterministic\", k = 3, noise = 0.25, type = \"split\", return.coords = FALSE, datasources = NULL )"},{"path":"/reference/ds.scatterPlot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"x character string specifying name explanatory variable, numeric vector. y character string specifying name response variable, numeric vector. method character string specifies method used generated non-disclosive coordinates displayed scatter plot. argument can set 'deteministic' 'probabilistic'. Default 'deteministic'. information see Details. k number nearest neighbours centroid calculated. Default 3. information see Details. noise percentage initial variance used variance embedded noise argument method set 'probabilistic'. information see Details. type character represents type graph display. can set 'combine' 'split'. Default 'split'. information see Details. return.coords logical. TRUE coordinates anonymised data points return Console. Default value FALSE. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.scatterPlot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"ds.scatterPlot returns client-side one scatter plots depending argument type.","code":""},{"path":"/reference/ds.scatterPlot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"generation scatter plot original data disclosive permitted DataSHIELD, function allows user plot non-disclosive scatter plots. argument method set 'deterministic', server-side function searches k-1 nearest neighbours single data point calculates centroid k points. proximity defined minimum Euclidean distances z-score transformed data. coordinates centroids estimated function applies scaling expand centroids back dispersion original data. scaling achieved multiplying centroids scaling factor equal ratio standard deviation original variable standard deviation calculated centroids. coordinates scaled centroids returned client-side. value k specified user. suggested default value equal 3 also suggested minimum threshold used prevent disclosure specified protection filter nfilter.kNN. value k increases, disclosure risk decreases utility loss increases. value k used argument method set 'deterministic'. value k ignored argument method set 'probabilistic'. argument method set 'probabilistic', server-side function generates random normal noise zero mean variance equal 10% variance x y variable. noise added x y variable disturbed addition noise data returned client-side. Note seed random number generator fixed specific number generated data therefore user gets figure every time chooses probabilistic method given set variables. value noise used argument method set 'probabilistic'. value noise ignored argument method set 'deterministic'. type argument can set two graphics display: (1) type = 'combine' scatter plot combined data generated. (2) type = 'split' one scatter plot study generated. Server function called: scatterPlotDS","code":""},{"path":"/reference/ds.scatterPlot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.scatterPlot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates non-disclosive scatter plots — ds.scatterPlot","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Example 1: generate a scatter plot for each study separately #Using the default deterministic method and k = 10 ds.scatterPlot(x = \"D$PM_BMI_CONTINUOUS\", y = \"D$LAB_GLUC_ADJUSTED\", method = \"deterministic\", k = 10, type = \"split\", datasources = connections) #Example 2: generate a combined scatter plot with the probabilistic method #and noise of variance 0.5% of the variable's variance, and display the coordinates # of the anonymised data points to the Console ds.scatterPlot(x = \"D$PM_BMI_CONTINUOUS\", y = \"D$LAB_GLUC_ADJUSTED\", method = \"probabilistic\", noise = 0.5, type = \"combine\", datasources = connections) #Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.seq.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a sequence in the server-side — ds.seq","title":"Generates a sequence in the server-side — ds.seq","text":"function generates sequence given parameters server-side.","code":""},{"path":"/reference/ds.seq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a sequence in the server-side — ds.seq","text":"","code":"ds.seq( FROM.value.char = \"1\", BY.value.char = \"1\", TO.value.char = NULL, LENGTH.OUT.value.char = NULL, ALONG.WITH.name = NULL, newobj = \"newObj\", datasources = NULL )"},{"path":"/reference/ds.seq.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a sequence in the server-side — ds.seq","text":".value.char integer number character specifying starting value sequence. Default \"1\". .value.char integer number character specifying value increment step sequence. Default \"1\". .value.char integer number character specifying terminal value sequence. Default NULL. information see Details. LENGTH..value.char integer number character specifying length sequence point extension stopped. Default NULL. information see Details. ALONG..name character string specifying name standard vector generate vector length. information see Details. newobj character string provides name output variable stored data servers. Default seq.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.seq.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a sequence in the server-side — ds.seq","text":"ds.seq returns server-side generated sequence. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.seq.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a sequence in the server-side — ds.seq","text":"function similar native R function seq(). creates flexible range sequence vectors can used help manage analyse data. Note: combinations arguments allowed function seq native R also prohibited ds.seq. specific, .value.char argument defines start sequence .value.char defines sequence incremented (decremented) step. sequence stops can defined three different ways: (1) .value.char indicates terminal value sequence. example, ds.seq(.value.char = \"3\", .value.char = \"2\", .value.char = \"7\") creates sequence 3,5,7 server-side. (2) LENGTH..value.char indicates length sequence. example, ds.seq(.value.char = \"3\", .value.char = \"2\", LENGTH..value.char = \"7\") creates sequence 3,5,7,9,11,13,15 server-side. (3) ALONG..name specifies name variable server-side, sequence study equal length variable. example, ds.seq(.value.char = \"3\", .value.char = \"2\", ALONG..name = \"var.x\") creates sequence var.x length 100 study 1 sequence written study 1 3,5,7,...,197,199,201 var.x length 4 study 2, sequence written study 2 3,5,7,9. one three arguments: .value.char, LENGTH..value.char ALONG..name can non-null one call. LENGTH..value.char argument specify number decimal point character form result sequence length(integer) + 1. example, LENGTH..value.char = \"1000.0001\" generates sequence length 1001. Server function called: seqDS","code":""},{"path":"/reference/ds.seq.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a sequence in the server-side — ds.seq","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.seq.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates a sequence in the server-side — ds.seq","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create 3 different sequences ds.seq(FROM.value.char = \"1\", BY.value.char = \"2\", TO.value.char = \"7\", newobj = \"new.seq1\", datasources = connections) ds.seq(FROM.value.char = \"4\", BY.value.char = \"3\", LENGTH.OUT.value.char = \"10\", newobj = \"new.seq2\", datasources = connections) ds.seq(FROM.value.char = \"2\", BY.value.char = \"5\", ALONG.WITH.name = \"D$GENDER\", newobj = \"new.seq3\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.setDefaultOpals.html","id":null,"dir":"Reference","previous_headings":"","what":"Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals","title":"Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals","text":"creates default set Opal objects called 'default.opals","code":""},{"path":"/reference/ds.setDefaultOpals.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals","text":"","code":"ds.setDefaultOpals(opal.name)"},{"path":"/reference/ds.setDefaultOpals.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals","text":"Copies specified set Opals (client-side server) calls copy 'default.opals'","code":""},{"path":"/reference/ds.setDefaultOpals.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals","text":"default one set opals available analysis, DataSHIELD client-side functions use full set Opals unless 'datasources=' argument set specifies particular subset Opals used instead. correct identification full single set opals based datashield.connections_find() function internal DataSHIELD function run start nearly every client side function. illustrate, single set Opals called 'study.opals' consists six opals numbered study.opals[1] study.opals[6] client-side functions use data six 'study.opals' unless, say, datasources=study.opals[c(2,5)] declared data second fifth studies used. hand, one set Opals analytic environment client-side functions unable determine set use. function datashield.connections_find() therefore written one Opal sets called 'default.opals' set - .e. 'default.opals' - selected default DataSHIELD client-side functions. one set Opals analytic environment NONE called 'default.opals', function ds.setDefaultOpals() therefore copies one set opals name copy 'default.opals'. set selected default client-side functions, unless deleted alternative set opals copied named 'default.opals'. Regardless many sets opals exist regardless whether may called 'default.opals', 'datasources=' argument overrides defaults allows user base / analysis set opals subset opals. earlier version 'datashield.connections_find()' asked user specify Opal choose default identified, work versions R removed.","code":""},{"path":"/reference/ds.setDefaultOpals.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Creates a default set of Opal objects called 'default.opals' — ds.setDefaultOpals","text":"Burton, PR. 28/9/16","code":""},{"path":"/reference/ds.setSeed.html","id":null,"dir":"Reference","previous_headings":"","what":"Server-side random number generation — ds.setSeed","title":"Server-side random number generation — ds.setSeed","text":"Primes pseudorandom number generator data source","code":""},{"path":"/reference/ds.setSeed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Server-side random number generation — ds.setSeed","text":"","code":"ds.setSeed(seed.as.integer = NULL, datasources = NULL)"},{"path":"/reference/ds.setSeed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Server-side random number generation — ds.setSeed","text":"seed..integer numeric value NULL primes random seed data source. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.setSeed.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Server-side random number generation — ds.setSeed","text":"Sets values vector integers length 626 known .Random.seed data source true current state random seed source. also returns value trigger integer primed random seed vector (.Random.seed) source also integer vector 626 elements .Random.seed .","code":""},{"path":"/reference/ds.setSeed.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Server-side random number generation — ds.setSeed","text":"function generates instance full pseudorandom number seed vector integers length 626 called .Random.seed, vector written server-side. function similar native R function set.seed(). seed..integer argument current limitation value integer can specified -2147483647 +2147483647 (+/- ([2^31]-1)). specify one integer call ds.setSeed (.e. value seed..integer argument) value used priming trigger value specified data sources pseudorandom number generators start position vector pseudorandom number values requested based one DataSHIELD's pseudorandom number generating functions precisely random vector generated source. want avoid can specify different priming value source using datasources argument generate random number vectors one source time different integer case. Furthermore, use one DataSHIELD's pseudorandom number generating functions: ds.rNorm, ds.rUnif, ds.rPois ds.rBinom. function call automatically uses single integer priming seed specify generate different integers source. Server function called: setSeedDS","code":""},{"path":"/reference/ds.setSeed.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Server-side random number generation — ds.setSeed","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.setSeed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Server-side random number generation — ds.setSeed","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Generate a pseudorandom number in the server-side ds.setSeed(seed.as.integer = 152584, datasources = connections) #Specify the pseudorandom number only in the first source ds.setSeed(seed.as.integer = 741, datasources = connections[1])#only the frist study is used (study1) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.skewness.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculates the skewness of a server-side numeric variable — ds.skewness","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"function calculates skewness numeric variable stored server-side (Opal server).","code":""},{"path":"/reference/ds.skewness.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"","code":"ds.skewness( x = NULL, method = 1, type = \"both\", datasources = NULL, classConsistencyCheck = FALSE )"},{"path":"/reference/ds.skewness.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"x character string specifying name numeric variable. method integer value 1 3 selecting one algorithms computing skewness. information see Details. default value set 1. type character string represents type analysis carry . type can set : 'combine', 'split' ''. information see Details. default value set ''. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default FALSE.","code":""},{"path":"/reference/ds.skewness.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"ds.skewness returns matrix showing skewness input numeric variable number valid observations.","code":""},{"path":"/reference/ds.skewness.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"function similar function skewness R package e1071. function calculates skewness input variable x three different methods: (1) method set 1 following formula used \\( skewness= \\frac{\\sum_{=1}^{N} (x_i - \\bar(x))^3 /N}{(\\sum_{=1}^{N} ((x_i - \\bar(x))^2) /N)^(3/2) }\\), \\( \\bar{x} \\) mean x \\(N\\) number observations. (2) method set 2 following formula used \\( skewness= \\frac{\\sum_{=1}^{N} (x_i - \\bar(x))^3 /N}{(\\sum_{=1}^{N} ((x_i - \\bar(x))^2) /N)^(3/2) } * \\frac{\\sqrt(N(N-1)}{n-2}\\). (3) method set 3 following formula used \\( skewness= \\frac{\\sum_{=1}^{N} (x_i - \\bar(x))^3 /N}{(\\sum_{=1}^{N} ((x_i - \\bar(x))^2) /N)^(3/2) } * (\\frac{N-1}{N})^(3/2)\\). type argument can set follows: (1) type set 'combine', 'combined', 'combines' 'c', global skewness returned. (2) type set 'split', 'splits' 's', skewness returned separately study. (3) type set '' 'b', sets outputs produced. x contains missing value, function removes calculation skewness. Server functions called: skewnessDS1 skewnessDS2","code":""},{"path":"/reference/ds.skewness.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"Demetris Avraam, DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.skewness.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculates the skewness of a server-side numeric variable — ds.skewness","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Calculate the skewness of LAB_TSC numeric variable for each study separately and combined ds.skewness(x = \"D$LAB_TSC\", method = 1, type = \"both\", datasources = connections) # Clear the Datashield R sessions and logout DSI::datashield.logout(connections) } # }"},{"path":"/reference/ds.sqrt.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the square root values of a variable — ds.sqrt","title":"Computes the square root values of a variable — ds.sqrt","text":"Computes square root values specified numeric integer vector. function similar R function sqrt.","code":""},{"path":"/reference/ds.sqrt.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the square root values of a variable — ds.sqrt","text":"","code":"ds.sqrt(x = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.sqrt.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the square root values of a variable — ds.sqrt","text":"x character string providing name numeric integer vector. newobj character string provides name output variable stored data servers. Default name set sqrt.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.sqrt.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the square root values of a variable — ds.sqrt","text":"ds.sqrt assigns vector study includes square root values input numeric integer vector specified argument x. created vectors stored servers.","code":""},{"path":"/reference/ds.sqrt.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the square root values of a variable — ds.sqrt","text":"function calls server-side function sqrtDS computes square root values elements numeric integer vector assigns new vector square root values server-side. name new generated vector specified user argument newobj, otherwise named default sqrt.newobj.","code":""},{"path":"/reference/ds.sqrt.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the square root values of a variable — ds.sqrt","text":"Demetris Avraam DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.sqrt.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes the square root values of a variable — ds.sqrt","text":"","code":"if (FALSE) { # \\dontrun{ # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Example 1: Get the square root of LAB_HDL variable ds.sqrt(x='D$LAB_HDL', newobj='LAB_HDL.sqrt', datasources=connections) # compare the mean of LAB_HDL and of LAB_HDL.sqrt # Note here that the number of missing values is bigger in the LAB_HDL.sqrt ds.mean(x='D$LAB_HDL', datasources=connections) ds.mean(x='LAB_HDL.sqrt', datasources=connections) # Example 2: Generate a repeated vector of the squares of integers from 1 to 10 # and get their square roots ds.make(toAssign='rep((1:10)^2, times=10)', newobj='squares.vector', datasources=connections) ds.sqrt(x='squares.vector', newobj='sqrt.vector', datasources=connections) ds.table(rvar='squares.vector')$output.list$TABLE_rvar.by.study_counts ds.table(rvar='sqrt.vector')$output.list$TABLE_rvar.by.study_counts # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.subset.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a valid subset of a table or a vector — ds.subset","title":"Generates a valid subset of a table or a vector — ds.subset","text":"function uses R classical subsetting squared brackets '[]' allows also subset using logical operator threshold. object subset must vector (factor, numeric character) table (data.frame matrix).","code":""},{"path":"/reference/ds.subset.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a valid subset of a table or a vector — ds.subset","text":"","code":"ds.subset( x = NULL, subset = \"subsetObject\", completeCases = FALSE, rows = NULL, cols = NULL, logicalOperator = NULL, threshold = NULL, datasources = NULL )"},{"path":"/reference/ds.subset.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a valid subset of a table or a vector — ds.subset","text":"x character, name dataframe factor vector range subset. subset name output object, list holds subset object. set NULL default name list 'subsetObject' completeCases character tells complete cases included . rows vector integers, indices rows extract. cols vector integers vector characters; indices columns extract names. logicalOperator boolean, logical parameter use user wishes subset vector using logical operator. parameter ignored input data vector. threshold numeric, threshold use conjunction logical parameter. parameter ignored input data vector. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.subset.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a valid subset of a table or a vector — ds.subset","text":"data return user, generated subset dataframe stored server side.","code":""},{"path":"/reference/ds.subset.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a valid subset of a table or a vector — ds.subset","text":"(1) input data table user specifies rows /columns include subset; columns can referred names. Table subsetting can also done using name variable threshold (see example 3). (2) input data vector parameters 'rows', 'logical' 'threshold' provided last two ignored (.e. 'rows' precedence two parameters ). IMPORTANT NOTE: requested subset valid (.e. contains less allowed number observations) values turned missing values (NA). Hence invalid subset indicated fact values within set NA.","code":""},{"path":[]},{"path":"/reference/ds.subset.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a valid subset of a table or a vector — ds.subset","text":"Gaye, .","code":""},{"path":"/reference/ds.subset.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates a valid subset of a table or a vector — ds.subset","text":"","code":"if (FALSE) { # \\dontrun{ # load the login data data(logindata) # login and assign some variables to R myvar <- list(\"DIS_DIAB\",\"PM_BMI_CONTINUOUS\",\"LAB_HDL\", \"GENDER\") conns <- datashield.login(logins=logindata,assign=TRUE,variables=myvar) # Example 1: generate a subset of the assigned dataframe (by default the table is named 'D') # with complete cases only ds.subset(x='D', subset='subD1', completeCases=TRUE) # display the dimensions of the initial table ('D') and those of the subset table ('subD1') ds.dim('D') ds.dim('subD1') # Example 2: generate a subset of the assigned table (by default the table is named 'D') # with only the variables # DIS_DIAB' and'PM_BMI_CONTINUOUS' specified by their name. ds.subset(x='D', subset='subD2', cols=c('DIS_DIAB','PM_BMI_CONTINUOUS')) # Example 3: generate a subset of the table D with bmi values greater than or equal to 25. ds.subset(x='D', subset='subD3', logicalOperator='PM_BMI_CONTINUOUS>=', threshold=25) # Example 4: get the variable 'PM_BMI_CONTINUOUS' from the dataframe 'D' and generate a # subset bmi # vector with bmi values greater than or equal to 25 ds.assign(toAssign='D$PM_BMI_CONTINUOUS', newobj='BMI') ds.subset(x='BMI', subset='BMI25plus', logicalOperator='>=', threshold=25) # Example 5: subsetting by rows: # get the logarithmic values of the variable 'lab_hdl' and generate a subset with # the first 50 observations of that new vector. If the specified number of row is # greater than the total # number of rows in any of the studies the process will stop. ds.assign(toAssign='log(D$LAB_HDL)', newobj='logHDL') ds.subset(x='logHDL', subset='subLAB_HDL', rows=c(1:50)) # now get a subset of the table 'D' with just the 100 first observations ds.subset(x='D', subset='subD5', rows=c(1:100)) # clear the Datashield R sessions and logout datashield.logout(conns) } # }"},{"path":"/reference/ds.subsetByClass.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"function takes categorical variable data frame input generates subset(s) variables data frames category.","code":""},{"path":"/reference/ds.subsetByClass.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"","code":"ds.subsetByClass( x = NULL, subsets = \"subClasses\", variables = NULL, datasources = NULL )"},{"path":"/reference/ds.subsetByClass.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"x character, name dataframe vector generate subsets . subsets name output object, list holds subset objects. set NULL default name list 'subClasses'. variables vector string characters, name(s) variables subset . datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.subsetByClass.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"data return user messages printed .","code":""},{"path":"/reference/ds.subsetByClass.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"input data object data frame possible specify variables subset . subset 'valid' values reported missing (.e. NA), name subsets labelled suffix '_INVALID'. Subsets considered invalid number observations holds 1 threshold allowed data owner. subset empty (.e. entries) name subset labelled suffix '_EMPTY'.","code":""},{"path":[]},{"path":"/reference/ds.subsetByClass.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"Gaye, . Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.subsetByClass.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates valid subset(s) of a data frame or a factor — ds.subsetByClass","text":"","code":"if (FALSE) { # \\dontrun{ # load the login data data(logindata) # login and assign some variables to R myvar <- list('DIS_DIAB','PM_BMI_CONTINUOUS','LAB_HDL', 'GENDER') conns <- datashield.login(logins=logindata,assign=TRUE,variables=myvar) # Example 1: generate all possible subsets from the table assigned above (one subset table # for each class in each factor) ds.subsetByClass(x='D', subsets='subclasses') # display the names of the subset tables that were generated in each study ds.names('subclasses') # Example 2: subset the table initially assigned by the variable 'GENDER' ds.subsetByClass(x='D', subsets='subtables', variables='GENDER') # display the names of the subset tables that were generated in each study ds.names('subtables') # Example 3: generate a new variable 'gender' and split it into two vectors: males # and females ds.assign(toAssign='D$GENDER', newobj='gender') ds.subsetByClass(x='gender', subsets='subvectors') # display the names of the subset vectors that were generated in each study ds.names('subvectors') # clear the Datashield R sessions and logout datashield.logout(conns) } # }"},{"path":"/reference/ds.summary.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates the summary of a server-side object — ds.summary","title":"Generates the summary of a server-side object — ds.summary","text":"Generates summary server-side object.","code":""},{"path":"/reference/ds.summary.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates the summary of a server-side object — ds.summary","text":"","code":"ds.summary(x = NULL, datasources = NULL)"},{"path":"/reference/ds.summary.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates the summary of a server-side object — ds.summary","text":"x character string specifying name numeric factor variable. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.summary.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates the summary of a server-side object — ds.summary","text":"ds.summary returns client-side class size server-side object. Also information returned depending class object. example, potentially disclosive information minimum maximum values numeric vectors returned. summary given study separately.","code":""},{"path":"/reference/ds.summary.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates the summary of a server-side object — ds.summary","text":"function provides insight object. Unlike similar native R summary function limited class objects can used input reduce risk disclosure. example, minimum maximum values numeric vector given client potentially disclosive. server functions called: isValidDS, dimDS colnamesDS","code":""},{"path":"/reference/ds.summary.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates the summary of a server-side object — ds.summary","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.summary.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates the summary of a server-side object — ds.summary","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # Connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() # Log onto the remote Opal training servers connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Calculate the summary of a numeric variable ds.summary(x = \"D$LAB_TSC\", datasources = connections) #Calculate the summary of a factor variable ds.summary(x = \"D$PM_BMI_CATEGORICAL\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.table.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","title":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","text":"Creates 1-dimensional, 2-dimensional 3-dimensional tables using table function native R.","code":""},{"path":"/reference/ds.table.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","text":"","code":"ds.table( rvar = NULL, cvar = NULL, stvar = NULL, report.chisq.tests = FALSE, exclude = NULL, useNA = \"always\", suppress.chisq.warnings = FALSE, table.assign = FALSE, newobj = NULL, datasources = NULL, force.nfilter = NULL )"},{"path":"/reference/ds.table.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","text":"rvar character string (inverted commas) specifying name variable defining rows 2 dimensional tables form output. Please see 'details' information one-dimensional tables variable name provided NULL cvar character string specifying name variable defining columns 2 dimensional tables form output. stvar character string specifying name variable indexes separate two dimensional tables output call specifies 3 dimensional table. report.chisq.tests TRUE, chi-squared tests applied every 2 dimensional table output reported \"chisq.test_table.name\". Default = FALSE. exclude argument passed table function native R called tableDS. help table native R indicates 'exclude' specifies levels deleted factors rvar, cvar stvar. argument include NA argument specified, implies = \"always\" DataSHIELD. read help table native R including 'details' 'examples' (particularly 'd.patho') see response table different combinations arguments can non-intuitive. particularly one type missing (e.g. missing observation well missing NaN response mathematical function - log(-3.0)). DataSHIELD, one complex settings (common) interpret output approached might try: (1) making sure variable producing strange results class factor rather integer numeric - although integers numerics coerced factors ds.table can occasionally behave less well NA setting complex; (2) specify argument e.g. exclude = c(\"NaN\",\"3\") argument e.g. useNA= \"\"; (3) excluding multiple levels e.g exclude = c(\"NA\",\"3\") can reduce one e.g. exclude = c(\"NA\") remove 3s deleting rows data, converting 3s different value. useNA argument passed table function native R called tableDS. DataSHIELD, argument can take two values: \"\" \"always\" indicate whether include NA values table. information, please see help argument () /help table function native R. Default value set \"always\". suppress.chisq.warnings set TRUE, default warnings suppressed otherwise produced table function native R whenever expected cell count one cells less 5. Default FALSE. details can found 'details' help provided argument (). table.assign Boolean argument set default FALSE. FALSE ds.table function acts standard aggregate function - returns table specified call clientside can visualised worked analyst. TRUE, table object also written serverside. explained 'details' (), may useful elements table need used drive forward overall analysis (e.g. help select individuals analysis sub-sample), required table visualised returned clientside fails disclosure rules. newobj character string providing name output table object written serverside TRUE. explicit name table object specified, nevertheless TRUE, name serverside table object defaults table.newobj. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. specified, set without inverted commas: e.g. datasources=connections.em datasources=default.connections. wish apply function solely e.g. second connection server set three, argument can specified : e.g. datasources=connections.em[2]. wish specify first third connection servers set specify: e.g. datasources=connections.em[c(1,3)]. force.nfilter non-NULL must specified positive integer represented character string: e.g. \"173\". effect standard value 'nfilter.tab' (often 1, 3, 5 10 depending value data custodian selected particular data set), new value (, 173). CRUCIALLY, ds.table function allows standard value INCREASED. standard value set 5 (one R options set serverside connection), \"6\" \"4981\" allowable values argument \"4\" \"1\" . purpose argument user developer force table fail disclosure control tests /can see happens check behaving anticipated/hoped.","code":""},{"path":"/reference/ds.table.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","text":"created requested table based serverside data returned clientside analyst visualise (unless blocked fails disclosure control criteria error reason). clientside output ds.table includes error messages identify creation table particular study failed . table.assign=TRUE, ds.table also writes requested table object named argument set 'newObj' default. information visible material passed clientside, optional table object written serverside can seen 'details' ().","code":""},{"path":"/reference/ds.table.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","text":"ds.table function selects numeric, integer factor variables serverside define contingency table three dimensions. native R table function basically operates factors variables specified integers numerics first coerced factors. 1-dimensional, 2-dimensional 3-dimensional table generated given study satisfies appropriate disclosure-control criteria can returned directly clientside presented study-specific table also included combined table across studies. data custodian responsible data security given study can specify minimum non-zero cell count determines whether disclosure-control criterion can viewed met. count one cell table falls specified threshold (also non-zero) whole table blocked returned clientside. However, even table potentially disclosive can still written serverside empty representation structure table returned clientside. contents cells serverside table object reflected vector counts one component table object. true counts studyside vector replaced sequential set cell-IDs running 1:n (n total number cells table) empty representation structure potentially disclosive table returned clientside. cell-IDs reflect order counts true counts vector serverside. consequence, number 13 appears cell empty table returned clientside, means true count cell held 13th element true count vector saved serverside. means data analyst can still make use counts call ds.table function drive ongoing analysis even one non-zero cell counts fall specified threshold potential disclosure risk. table object serverside visualised transferred clientside, DataSHIELD ensures although can, way, used advance analysis, create direct risk disclosure. argument identifies variable defining rows 2-dimensional tables produced output. argument identifies variable defining columns 2-dimensional tables produced output. creating 3-dimensional table ('separate tables') argument identifies variable indexes set two dimensional tables output ds.table. minor technicality, noted 1-dimensional table required, one need specify value argument one dimensional table output presented row vectors technically variable defines columns 1 x n vector. However, ds.table function deals 1-dimensional tables differently 2 3 dimensional tables key components output one dimensional tables actually two dimensional: rows defined one column studies. output list generated ds.table contains tables based counts named \"table.name_counts\" tables reporting corresponding column proportions (\"table.name_col.props\") row proportions (\"table.name_row.props\"). one dimensional tables output output tables include _counts _proportions. latter called _col.props _row.props , reasons noted , technically column proportions based distribution variable. argument set TRUE, chisq tests applied every 2-dimensional table output reported \"chisq.test_table.name\". argument defaults FALSE. least one expected cell counts < 5 output table, native R function returns warning. DataSHIELD setting often means every study several tables may return warning debatable whether warning really statistically important, argument can set TRUE block warnings. However, defaulted FALSE.","code":""},{"path":"/reference/ds.table.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates 1-, 2-, and 3-dimensional contingency tables with option of assigning to serverside only and producing chi-squared statistics — ds.table","text":"Paul Burton Alex Westerberg DataSHIELD Development Team, 01/05/2020","code":""},{"path":"/reference/ds.table1D.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates 1-dimensional contingency tables — ds.table1D","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"function ds.table1D client-side wrapper function. calls server-side function table1DDS generate 1-dimensional tables data sources.","code":""},{"path":"/reference/ds.table1D.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"","code":"ds.table1D( x = NULL, type = \"combine\", warningMessage = TRUE, datasources = NULL )"},{"path":"/reference/ds.table1D.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"x character, name numerical vector discrete values - usually factor. type character represent type table output: pooled table one table data source. type set 'combine', pooled 1-dimensional table returned; type set 'split' 1-dimensional table returned data source. warningMessage boolean, set TRUE (default) warning displayed returned table invalid. Warning messages suppressed parameter set FALSE. However analyst can still view 'validity' information stored output object 'validity' - see list output objects. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.table1D.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"list object containing following items: counts table(s) hold counts level/category. cells counts invalid (see 'Details' section) total (outer) cell counts displayed returned individual study tables pooled table. percentages table(s) hold percentages level/category. also inner cells reported missing one cells 'invalid'. validity text informs analyst validity output tables. tables invalid studies originated also mentioned text message.","code":""},{"path":"/reference/ds.table1D.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"table returned server side function might valid (non disclosive - table cell counts 1 minimal number agreed data owner set data repository) invalid (potentially disclosive - one table cells count 1 minimal number agreed data owner). 1-dimensional table invalid cells set NA except total count. way possible know total count combine total counts across data sources possible identify cell(s) small counts render table invalid.","code":""},{"path":[]},{"path":"/reference/ds.table1D.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"Gaye, .; Burton, P.","code":""},{"path":"/reference/ds.table1D.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates 1-dimensional contingency tables — ds.table1D","text":"","code":"if (FALSE) { # \\dontrun{ # load the file that contains the login details data(logindata) # login and assign all the stored variables to R conns <- datashield.login(logins=logindata,assign=TRUE) # Example 1: generate a one dimensional table, outputting combined (pooled) contingency tables output <- ds.table1D(x='D$GENDER') output$counts output$percentages output$validity # Example 2: generate a one dimensional table, outputting study specific contingency tables output <- ds.table1D(x='D$GENDER', type='split') output$counts output$percentages output$validity # Example 3: generate a one dimensional table, outputting study specific and combined # contingency tables - see what happens if the reruened table is 'invalid'. output <- ds.table1D(x='D$DIS_CVA') output$counts output$percentages output$validity # clear the Datashield R sessions and logout datashield.logout(conns) } # }"},{"path":"/reference/ds.table2D.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates 2-dimensional contingency tables — ds.table2D","title":"Generates 2-dimensional contingency tables — ds.table2D","text":"function ds.table2D client-side wrapper function. calls server-side function 'table2DDS' generates 2-dimensional contingency table data source.","code":""},{"path":"/reference/ds.table2D.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates 2-dimensional contingency tables — ds.table2D","text":"","code":"ds.table2D( x = NULL, y = NULL, type = \"both\", warningMessage = TRUE, datasources = NULL )"},{"path":"/reference/ds.table2D.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates 2-dimensional contingency tables — ds.table2D","text":"x character, name numerical vector discrete values - usually factor. y character, name numerical vector discrete values - usually factor. type character represent type table output: pooled table one table data source . type set 'combine', pooled 2-dimensional table returned; type set 'split' 2-dimensional table returned data source. type set '' (default) pooled 2-dimensional table plus 2-dimensional table data source returned. warningMessage boolean, set TRUE (default) warning displayed returned table invalid. Warning messages suppressed parameter set FALSE. However analyst can still view 'validity' information stored output object 'validity' - see list output objects. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.table2D.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates 2-dimensional contingency tables — ds.table2D","text":"list object containing following items: colPercent table(s) hold column percentages level/category. Inner cells reported missing one cells 'invalid'. rowPercent table(s) hold row percentages level/category. Inner cells reported missing one cells 'invalid'. chi2Test Chi-squared test homogeneity. counts table(s) hold counts level/category. cell counts invalid (see 'Details' section) total (outer) cell counts displayed returned individual study tables pooled table. validity text informs analyst validity output tables. tables invalid studies originated also mentioned text message.","code":""},{"path":"/reference/ds.table2D.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates 2-dimensional contingency tables — ds.table2D","text":"table returned server side function might valid (non disclosive - table cell counts 1 minimal number agreed data owner set data repository \"nfilter.tab\") invalid (potentially disclosive - one table cells count 1 minimal number agreed data owner). 2-dimensional table invalid cells set NA except total counts. way, possible combine total counts across data sources possible identify cell(s) small counts render table invalid.","code":""},{"path":[]},{"path":"/reference/ds.table2D.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates 2-dimensional contingency tables — ds.table2D","text":"Amadou Gaye, Paul Burton, Demetris Avraam, DataSHIELD Development Team","code":""},{"path":[]},{"path":"/reference/ds.tapply.assign.html","id":null,"dir":"Reference","previous_headings":"","what":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"Applies one selected range functions summarize outcome variable one indexing factors write resultant summary object server-side.","code":""},{"path":"/reference/ds.tapply.assign.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"","code":"ds.tapply.assign( X.name = NULL, INDEX.names = NULL, FUN.name = NULL, newobj = NULL, datasources = NULL )"},{"path":"/reference/ds.tapply.assign.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"X.name character string specifying name variable summarized. INDEX.names character string specifying name single factor vector names two factors index variable summarized. information see Details. FUN.name character string specifying name one allowable summarizing functions. can set : \"N\" (\"length\"), \"mean\",\"sd\", \"sum\", \"quantile\". information see Details. newobj character string provides name output variable stored data servers. Default tapply.assign.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.tapply.assign.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"ds.tapply.assign returns array summarized values. array written server-side. number dimensions INDEX.","code":""},{"path":"/reference/ds.tapply.assign.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"function applies one selected range functions cell ragged array, (non-empty) group values given unique combination series indexing factors. range allowable summarizing functions DataSHIELD ds.tapply function much restrictive native R tapply function. reason protection disclosure risk. functions required future , provided non-disclosive, DataSHIELD development team work requested. protect disclosure number observations summarizing group source calculated falls value nfilter.tab (minimum allowable non-zero count contingency table) tapply analysis source return error message. value nfilter.tab can set modified data custodian. analytic team wishes value reduced (e.g. 1 allow output tapply returned) needs formally discussed agreed data custodian. reason tapply analysis , example, break dataset small number values individual flag individuals got least one positive value binary outcome variable, flagging overtly returned client-side. Rather, can written vector server-side source (, like server-side object, seen, abstracted copied). can done using ds.tapply.assign writes results newobj server-side test number observations group nfilter.tab. information see help option ds.tapply.assign function. native R tapply function optional arguments na.rm = TRUE FUN = mean exclude NAs outcome variable summarized. However, order keep DataSHIELD's ds.tapply ds.tapply.assign functions straightforward, server-side functions tapplyDS tapplyDS.assign starts stripping observations missing (NA) values either outcome variable one indexing factors. consequence, resultant analyses always based complete cases. INDEX.names argument native R tapply function can coerce non-factor vectors factors. However, always work using DataSHIELD ds.tapply ds.tapply.assign functions concerned indexing vector treated correctly factor, please first declare explicitly factor using ds.asFactor. FUN.name argument allowable functions : N length (number (non-missing) observations group defined combination indexing factors); mean; SD (standard deviation); sum; quantile (quantile probabilities set c(0.05,0.1,0.2,0.25,0.3,0.33,0.4,0.5,0.6,0.67,0.7,0.75,0.8,0.9,0.95)). Server function called: ds.tapply.assign","code":""},{"path":"/reference/ds.tapply.assign.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.tapply.assign.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Applies a Function Over a Ragged Array on the server-side — ds.tapply.assign","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Apply a Function Over a Server-Side Ragged Array. # Write the resultant object on the server-side ds.assign(toAssign = \"D$LAB_TSC\", newobj = \"LAB_TSC\", datasources = connections) ds.assign(toAssign = \"D$GENDER\", newobj = \"GENDER\", datasources = connections) ds.tapply.assign(X.name = \"LAB_TSC\", INDEX.names = c(\"GENDER\"), FUN.name = \"mean\", newobj=\"fun_mean.newobj\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.tapply.html","id":null,"dir":"Reference","previous_headings":"","what":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"Apply one selected range functions summarize outcome variable one indexing factors. resultant summary written client-side.","code":""},{"path":"/reference/ds.tapply.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"","code":"ds.tapply( X.name = NULL, INDEX.names = NULL, FUN.name = NULL, datasources = NULL )"},{"path":"/reference/ds.tapply.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"X.name character string specifying name variable summarized. INDEX.names character string specifying name single factor list vector names two factors index variable summarized. information see Details. FUN.name character string specifying name one allowable summarizing functions. can set : \"N\" (\"length\"), \"mean\",\"sd\", \"sum\", \"quantile\". information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.tapply.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"ds.tapply returns client-side array summarized values. number dimensions INDEX.","code":""},{"path":"/reference/ds.tapply.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"function similar native R function tapply(). applies one selected range functions cell ragged array, (non-empty) group values given unique combination series indexing factors. range allowable summarizing functions DataSHIELD ds.tapply function much restrictive native R tapply function. reason protection disclosure risk. functions required future , provided non-disclosive, DataSHIELD development team work requested. protect disclosure number observations summarizing group source calculated falls value nfilter.tab (minimum allowable non-zero count contingency table) tapply analysis source return error message. value nfilter.tab can set modified data custodian. analytic team wishes value reduced (e.g. 1 allow output tapply returned) needs formally discussed agreed data custodian. reason tapply analysis , example, break dataset small number values individual flag individuals got least one positive value binary outcome variable, flagging overtly returned client-side. Rather, can written vector server-side source (, like server-side object, seen, abstracted copied). can done using ds.tapply.assign writes results newobj server-side test number observations group nfilter.tab. information see help option ds.tapply.assign function. native R tapply function optional arguments na.rm = TRUE FUN = mean exclude NAs outcome variable summarized. However, order keep DataSHIELD's ds.tapply ds.tapply.assign functions straightforward, server-side functions tapplyDS tapplyDS.assign starts stripping observations missing (NA) values either outcome variable one indexing factors. consequence, resultant analyses always based complete cases. INDEX.names argument native R tapply function can coerce non-factor vectors factors. However, always work using DataSHIELD ds.tapply ds.tapply.assign functions concerned indexing vector treated correctly factor, please first declare explicitly factor using ds.asFactor. FUN.name argument allowable functions : N length (number (non-missing) observations group defined combination indexing factors); mean; SD (standard deviation); sum; quantile (quantile probabilities set c(0.05,0.1,0.2,0.25,0.3,0.33,0.4,0.5,0.6,0.67,0.7,0.75,0.8,0.9,0.95)). Server function called: tapplyDS","code":""},{"path":"/reference/ds.tapply.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.tapply.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Applies a Function Over a Server-Side Ragged Array — ds.tapply","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Apply a Function Over a Server-Side Ragged Array ds.assign(toAssign = \"D$LAB_TSC\", newobj = \"LAB_TSC\", datasources = connections) ds.assign(toAssign = \"D$GENDER\", newobj = \"GENDER\", datasources = connections) ds.tapply(X.name = \"LAB_TSC\", INDEX.names = c(\"GENDER\"), FUN.name = \"mean\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.testObjExists.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks if an R object exists on the server-side — ds.testObjExists","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"function checks specified data object exists correctly created specified set data servers.","code":""},{"path":"/reference/ds.testObjExists.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"","code":"ds.testObjExists(test.obj.name = NULL, datasources = NULL)"},{"path":"/reference/ds.testObjExists.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"test.obj.name character string specifying name object search. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.testObjExists.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"ds.testObjExists returns list messages specifying object exists server-side. specified object exist least one specified data sources exists class NULL, function returns error message specifying object exist data sources.","code":""},{"path":"/reference/ds.testObjExists.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"Close copies code function embedded functions create object wish test whether successfully created e.g. ds.make ds.asFactor. Server function called: testObjExistsDS","code":""},{"path":"/reference/ds.testObjExists.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.testObjExists.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Checks if an R object exists on the server-side — ds.testObjExists","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Check if D object exists on the server-side ds.testObjExists(test.obj.name = \"D\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.unList.html","id":null,"dir":"Reference","previous_headings":"","what":"Flattens Server-Side Lists — ds.unList","title":"Flattens Server-Side Lists — ds.unList","text":"Coerces object list class back class coerced list.","code":""},{"path":"/reference/ds.unList.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Flattens Server-Side Lists — ds.unList","text":"","code":"ds.unList(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.unList.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Flattens Server-Side Lists — ds.unList","text":"x.name character string specifying name input object unlisted. newobj character string provides name output variable stored data servers. Default unlist.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.unList.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Flattens Server-Side Lists — ds.unList","text":"ds.unList returns server-side unlist object. Also, two validity messages returned client-side indicating whether new object created data source whether valid form.","code":""},{"path":"/reference/ds.unList.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Flattens Server-Side Lists — ds.unList","text":"function similar native R function unlist. object coerced list, depending class original object information may lost. Thus, example, data frame coerced list information underpins structure data frame lost subject function ds.unList returned simpler class data frame e.g. numeric (basically numeric vector containing original data variables data frame structure). wish reconstruct original data frame , therefore, need specify structure e.g. column names, etc. Server function called: unListDS","code":""},{"path":"/reference/ds.unList.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Flattens Server-Side Lists — ds.unList","text":"DataSHIELD Development Team","code":""},{"path":"/reference/ds.unList.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Flattens Server-Side Lists — ds.unList","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Create a list on the server-side ds.asList(x.name = \"D\", newobj = \"list.D\", datasources = connections) #Flatten a server-side lists ds.unList(x.name = \"list.D\", newobj = \"un.list.D\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.unique.html","id":null,"dir":"Reference","previous_headings":"","what":"Perform 'unique' on a variable on the server-side — ds.unique","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"Perform 'unique', 'base' package specified variable server-side","code":""},{"path":"/reference/ds.unique.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"","code":"ds.unique(x.name = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.unique.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"x.name character string providing name variable, server, perform unique upon newobj character string provides name output object stored data servers. Default unique.newobj. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.unique.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"ds.unique returns vector unique R objects written server-side.","code":""},{"path":"/reference/ds.unique.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"create vector list duplicate values. Server function called: uniqueDS","code":""},{"path":"/reference/ds.unique.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"Stuart Wheater, DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.unique.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Perform 'unique' on a variable on the server-side — ds.unique","text":"","code":"if (FALSE) { # \\dontrun{ # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") # Create a vector with combined objects ds.unique(x.name = \"D$LAB_TSC\", newobj = \"new.vect\", datasources = connections) # Clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.var.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes server-side vector variance — ds.var","title":"Computes server-side vector variance — ds.var","text":"Computes variance given server-side vector.","code":""},{"path":"/reference/ds.var.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes server-side vector variance — ds.var","text":"","code":"ds.var( x = NULL, type = \"split\", datasources = NULL, classConsistencyCheck = FALSE )"},{"path":"/reference/ds.var.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes server-side vector variance — ds.var","text":"x character specifying name numerical vector. type character string represents type analysis carry . can set 'combine', 'combined', 'combines', 'split', 'splits', 's', '' 'b'. information see Details. datasources list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. classConsistencyCheck logical. TRUE, checks input object class across studies. Default FALSE.","code":""},{"path":"/reference/ds.var.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes server-side vector variance — ds.var","text":"ds.var returns client-side list including: Variance..Study: estimated variance, Nmissing (number missing observations), Nvalid (number valid observations) Ntotal (sum missing valid observations) separately study (type = split type = ).Global.Variance: estimated variance, Nmissing, Nvalid Ntotal across studies combined (type = combine type = ). Nstudies: number studies analysed.","code":""},{"path":"/reference/ds.var.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes server-side vector variance — ds.var","text":"function similar R function var. function can carry 3 types analysis depending argument type: (1) type set 'combine', 'combined', 'combines' 'c', global variance calculated. (2) type set 'split', 'splits' 's', variance calculated separately study. (3) type set '' 'b', sets outputs produced. Server function called: varDS","code":""},{"path":"/reference/ds.var.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes server-side vector variance — ds.var","text":"DataSHIELD Development Team Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/ds.var.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Computes server-side vector variance — ds.var","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") #Calculate the variance of a vector in the server-side ds.var(x = \"D$LAB_TSC\", type = \"split\", datasources = connections) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"},{"path":"/reference/ds.vectorCalc.html","id":null,"dir":"Reference","previous_headings":"","what":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"Carries row-wise operation two vector. function calls server side function; uses R operation symbols built DataSHIELD.","code":""},{"path":"/reference/ds.vectorCalc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"","code":"ds.vectorCalc(x = NULL, calc = NULL, newobj = NULL, datasources = NULL)"},{"path":"/reference/ds.vectorCalc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"x vector characters, names vectors include operation. calc character, symbol indicates mathematical operation carry : '+' addition, '/' division, *' multiplication '-' subtraction. newobj name output object. default name 'vectorcalc.newobj'. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/ds.vectorCalc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"data returned user, output vector stored server side.","code":""},{"path":"/reference/ds.vectorCalc.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"DataSHIELD possible perform operation vectors just using relevant R symbols (e.g. '+' addition, '*' multiplication, '-' subtraction '/' division). might however inconvenient number vectors include operation large. function takes names two vectors performs desired operation addition, multiplication, subtraction division. one vectors missing value one entry (.e. observation), operation returns missing value ('NA') entry; output vectors , hence length input vectors.","code":""},{"path":"/reference/ds.vectorCalc.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"Gaye, .","code":""},{"path":"/reference/ds.vectorCalc.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Performs a mathematical operation on two or more vectors — ds.vectorCalc","text":"","code":"if (FALSE) { # \\dontrun{ # load the file that contains the login details data(logindata) # login and assign the required variables to R myvar <- list('LAB_TSC','LAB_HDL') conns <- datashield.login(logins=logindata,assign=TRUE,variables=myvar) # performs an addtion of 'LAB_TSC' and 'LAB_HDL' myvectors <- c('D$LAB_TSC', 'D$LAB_HDL') ds.vectorCalc(x=myvectors, calc='+') # clear the Datashield R sessions and logout datashield.logout(conns) } # }"},{"path":"/reference/extract.html","id":null,"dir":"Reference","previous_headings":"","what":"Splits character by '$' and returns the single characters — extract","title":"Splits character by '$' and returns the single characters — extract","text":"internal function.","code":""},{"path":"/reference/extract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Splits character by '$' and returns the single characters — extract","text":"","code":"extract(input)"},{"path":"/reference/extract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Splits character by '$' and returns the single characters — extract","text":"input vector list characters","code":""},{"path":"/reference/extract.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Splits character by '$' and returns the single characters — extract","text":"vector characters","code":""},{"path":"/reference/extract.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Splits character by '$' and returns the single characters — extract","text":"required","code":""},{"path":"/reference/getPooledMean.html","id":null,"dir":"Reference","previous_headings":"","what":"Gets a pooled statistical mean — getPooledMean","title":"Gets a pooled statistical mean — getPooledMean","text":"internal function.","code":""},{"path":"/reference/getPooledMean.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gets a pooled statistical mean — getPooledMean","text":"","code":"getPooledMean(dtsources, x)"},{"path":"/reference/getPooledMean.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gets a pooled statistical mean — getPooledMean","text":"dtsources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. x character, name numeric vector","code":""},{"path":"/reference/getPooledMean.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gets a pooled statistical mean — getPooledMean","text":"pooled mean","code":""},{"path":"/reference/getPooledMean.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gets a pooled statistical mean — getPooledMean","text":"function called avoid calling client function 'ds.mean' may stop process due checks required computing mean inside function.","code":""},{"path":"/reference/getPooledVar.html","id":null,"dir":"Reference","previous_headings":"","what":"Gets a pooled variance — getPooledVar","title":"Gets a pooled variance — getPooledVar","text":"internal function.","code":""},{"path":"/reference/getPooledVar.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gets a pooled variance — getPooledVar","text":"","code":"getPooledVar(dtsources, x)"},{"path":"/reference/getPooledVar.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gets a pooled variance — getPooledVar","text":"dtsources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. x character, name numeric vector","code":""},{"path":"/reference/getPooledVar.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gets a pooled variance — getPooledVar","text":"pooled variance","code":""},{"path":"/reference/getPooledVar.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gets a pooled variance — getPooledVar","text":"function called avoid calling client function 'ds.var' may stop process due checks required computing mean inside function.","code":""},{"path":"/reference/glmChecks.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks if the elements in the glm model have the right characteristics — glmChecks","title":"Checks if the elements in the glm model have the right characteristics — glmChecks","text":"internal function required client function ds.glm verify variables ensure process halt inadvertently","code":""},{"path":"/reference/glmChecks.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks if the elements in the glm model have the right characteristics — glmChecks","text":"","code":"glmChecks(formula, data, offset, weights, datasources)"},{"path":"/reference/glmChecks.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks if the elements in the glm model have the right characteristics — glmChecks","text":"formula character, regression formula given string character data character, name optional data frame containing variables formula. offset null numeric vector can used specify priori known component included linear predictor fitting. weights character, name optional vector 'prior weights' used fitting process. NULL numeric vector. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/glmChecks.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks if the elements in the glm model have the right characteristics — glmChecks","text":"integer 0 check passed 1 failed","code":""},{"path":"/reference/glmChecks.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks if the elements in the glm model have the right characteristics — glmChecks","text":"variables checked ensure defined, empty (.e. missing complete) eventually ('offset' 'weights') 'numeric' non negative value ('weights').","code":""},{"path":"/reference/glmChecks.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Checks if the elements in the glm model have the right characteristics — glmChecks","text":"Gaye, . Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/isAssigned.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks an object has been generated on the server side — isAssigned","title":"Checks an object has been generated on the server side — isAssigned","text":"internal function.","code":""},{"path":"/reference/isAssigned.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks an object has been generated on the server side — isAssigned","text":"","code":"isAssigned(datasources = NULL, newobj = NULL)"},{"path":"/reference/isAssigned.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks an object has been generated on the server side — isAssigned","text":"datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. newobj character, name object look .","code":""},{"path":"/reference/isAssigned.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks an object has been generated on the server side — isAssigned","text":"nothing return process stopped object generated one server.","code":""},{"path":"/reference/isAssigned.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks an object has been generated on the server side — isAssigned","text":"calling assign function important know whether action completed checking output actually exists server side.","code":""},{"path":"/reference/isDefined.html","id":null,"dir":"Reference","previous_headings":"","what":"Checks if the objects are defined in all studies — isDefined","title":"Checks if the objects are defined in all studies — isDefined","text":"internal function.","code":""},{"path":"/reference/isDefined.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Checks if the objects are defined in all studies — isDefined","text":"","code":"isDefined(datasources = NULL, obj = NULL, error.message = TRUE)"},{"path":"/reference/isDefined.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Checks if the objects are defined in all studies — isDefined","text":"datasources list DSConnection-class objects obtained login. datasources argument specified, default set connections used: see datashield.connections_default. obj character vector, name object(s) look . error.message Boolean specifies function stop return error message input object defined one studies return list TRUE/FALSE indicating studies object defined","code":""},{"path":"/reference/isDefined.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Checks if the objects are defined in all studies — isDefined","text":"returns error message error.message argument set TRUE (default) input object defined one studies, Boolean value error.message argument set FALSE.","code":""},{"path":"/reference/isDefined.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Checks if the objects are defined in all studies — isDefined","text":"DataSHIELD object included analysis must defined (.e. exists) studies. process halt.","code":""},{"path":"/reference/isDefined.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Checks if the objects are defined in all studies — isDefined","text":"Demetris Avraam DataSHIELD Development Team","code":""},{"path":"/reference/logical2int.html","id":null,"dir":"Reference","previous_headings":"","what":"Turns a logical operator into an integer — logical2int","title":"Turns a logical operator into an integer — logical2int","text":"internal function.","code":""},{"path":"/reference/logical2int.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Turns a logical operator into an integer — logical2int","text":"","code":"logical2int(obj = NULL)"},{"path":"/reference/logical2int.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Turns a logical operator into an integer — logical2int","text":"obj character, logical parameter turn integer","code":""},{"path":"/reference/logical2int.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Turns a logical operator into an integer — logical2int","text":"integer","code":""},{"path":"/reference/logical2int.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Turns a logical operator into an integer — logical2int","text":"function called turn logical operator given character integer: '>' turned 1, '>=' 2, '<' 3, '<=' 4, '==' 5 '!=' 6.","code":""},{"path":"/reference/meanByClassHelper0a.html","id":null,"dir":"Reference","previous_headings":"","what":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","title":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","text":"internal function.","code":""},{"path":"/reference/meanByClassHelper0a.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","text":"","code":"meanByClassHelper0a(a, b, type, datasources)"},{"path":"/reference/meanByClassHelper0a.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","text":"character, name numeric vector. b character, name factor vector. type character represents type analysis carry . type set 'combine', pooled table results generated. type set 'split', table results generated study. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/meanByClassHelper0a.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","text":"table list tables hold length numeric variable mean standard deviation subgroup (subset).","code":""},{"path":"/reference/meanByClassHelper0a.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","text":"function called function 'ds.meanByClass' produce final tables user specifies two loose vectors.","code":""},{"path":"/reference/meanByClassHelper0a.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Computes the mean values of a numeric vector across a factor vector — meanByClassHelper0a","text":"Gaye, .","code":""},{"path":"/reference/meanByClassHelper0b.html","id":null,"dir":"Reference","previous_headings":"","what":"Runs the computation if variables are within a table structure — meanByClassHelper0b","title":"Runs the computation if variables are within a table structure — meanByClassHelper0b","text":"internal function.","code":""},{"path":"/reference/meanByClassHelper0b.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Runs the computation if variables are within a table structure — meanByClassHelper0b","text":"","code":"meanByClassHelper0b(x, outvar, covar, type, datasources)"},{"path":"/reference/meanByClassHelper0b.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Runs the computation if variables are within a table structure — meanByClassHelper0b","text":"x character, name dataset get subsets . outvar character vector, names continuous variables covar character vector, names 3 categorical variables type character represents type analysis carry . type set 'combine', pooled table results generated. type set 'split', table results generated study. datasources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default.","code":""},{"path":"/reference/meanByClassHelper0b.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Runs the computation if variables are within a table structure — meanByClassHelper0b","text":"table list tables hold length numeric variable(s) mean standard deviation subgroup (subset).","code":""},{"path":"/reference/meanByClassHelper0b.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Runs the computation if variables are within a table structure — meanByClassHelper0b","text":"function called function 'ds.meanByClass' produce final tables user specify table structure.","code":""},{"path":"/reference/meanByClassHelper0b.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Runs the computation if variables are within a table structure — meanByClassHelper0b","text":"Gaye, . Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/meanByClassHelper1.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates subset tables — meanByClassHelper1","title":"Generates subset tables — meanByClassHelper1","text":"internal function.","code":""},{"path":"/reference/meanByClassHelper1.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates subset tables — meanByClassHelper1","text":"","code":"meanByClassHelper1(dtsource, tables, variable, categories)"},{"path":"/reference/meanByClassHelper1.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates subset tables — meanByClassHelper1","text":"dtsource list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. tables character vector, tables breakdown variable character, variable subset categories character vector, classes variables subset ","code":""},{"path":"/reference/meanByClassHelper1.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates subset tables — meanByClassHelper1","text":"character names new subset tables.","code":""},{"path":"/reference/meanByClassHelper1.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates subset tables — meanByClassHelper1","text":"function called function 'ds.meanByClass' break initial table specified categorical variables.","code":""},{"path":"/reference/meanByClassHelper1.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates subset tables — meanByClassHelper1","text":"Gaye, .","code":""},{"path":"/reference/meanByClassHelper2.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates a table for pooled results — meanByClassHelper2","title":"Generates a table for pooled results — meanByClassHelper2","text":"internal function.","code":""},{"path":"/reference/meanByClassHelper2.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates a table for pooled results — meanByClassHelper2","text":"","code":"meanByClassHelper2(dtsources, tablenames, variables, invalidrecorder)"},{"path":"/reference/meanByClassHelper2.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates a table for pooled results — meanByClassHelper2","text":"dtsources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. tablenames character vector, name subset tables variables character vector, names continuous variables computes mean . invalidrecorder list, holds information invalid subsets study.","code":""},{"path":"/reference/meanByClassHelper2.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates a table for pooled results — meanByClassHelper2","text":"matrix, table contains length, mean standard deviation specified 'variables' subset table.","code":""},{"path":"/reference/meanByClassHelper2.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates a table for pooled results — meanByClassHelper2","text":"function called function 'ds.meanByClass' produce final table user sets parameter 'type' combine (default behaviour 'ds.meanByClass').","code":""},{"path":"/reference/meanByClassHelper2.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates a table for pooled results — meanByClassHelper2","text":"Gaye, . Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/meanByClassHelper3.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates results tables for each study separately — meanByClassHelper3","title":"Generates results tables for each study separately — meanByClassHelper3","text":"internal function.","code":""},{"path":"/reference/meanByClassHelper3.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates results tables for each study separately — meanByClassHelper3","text":"","code":"meanByClassHelper3(dtsources, tablenames, variables, invalidrecorder)"},{"path":"/reference/meanByClassHelper3.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates results tables for each study separately — meanByClassHelper3","text":"dtsources list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. tablenames character vector, name subset tables variables character vector, names continuous variables computes mean . invalidrecorder list, holds information invalid subsets study","code":""},{"path":"/reference/meanByClassHelper3.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generates results tables for each study separately — meanByClassHelper3","text":"list one results table study.","code":""},{"path":"/reference/meanByClassHelper3.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates results tables for each study separately — meanByClassHelper3","text":"function called function 'ds.meanByClass' produce final tables user sets parameter 'type' 'split'.","code":""},{"path":"/reference/meanByClassHelper3.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Generates results tables for each study separately — meanByClassHelper3","text":"Gaye, . Tim Cadman, Genomics Coordination Centre, UMCG, Netherlands","code":""},{"path":"/reference/meanByClassHelper4.html","id":null,"dir":"Reference","previous_headings":"","what":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","title":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","text":"internal function.","code":""},{"path":"/reference/meanByClassHelper4.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","text":"","code":"meanByClassHelper4( dtsource, alist, initialtable, variable = NA, categories = NA )"},{"path":"/reference/meanByClassHelper4.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","text":"dtsource list DSConnection-class objects obtained login. default set connections used: see datashield.connections_default. alist name list holds final subset tables initialtable character name table subset generated variable character, variable subset categories character vector, classes variables subset ","code":""},{"path":"/reference/meanByClassHelper4.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","text":"'loose' subset tables stored server side","code":""},{"path":"/reference/meanByClassHelper4.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","text":"function called function 'ds.meanByClass' obtain 'loose' subset tables 'subsetByClass' function handle table within list.","code":""},{"path":"/reference/meanByClassHelper4.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Gets the subset tables out of the list (i.e. unlist) — meanByClassHelper4","text":"Gaye, .","code":""},{"path":"/reference/rowPercent.html","id":null,"dir":"Reference","previous_headings":"","what":"Produces row percentages — rowPercent","title":"Produces row percentages — rowPercent","text":"INTERNAL function.","code":""},{"path":"/reference/rowPercent.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Produces row percentages — rowPercent","text":"","code":"rowPercent(dataframe)"},{"path":"/reference/rowPercent.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Produces row percentages — rowPercent","text":"dataframe data frame","code":""},{"path":"/reference/rowPercent.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Produces row percentages — rowPercent","text":"data frame","code":""},{"path":"/reference/rowPercent.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Produces row percentages — rowPercent","text":"function required required client function ds.table2D.","code":""},{"path":"/reference/rowPercent.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Produces row percentages — rowPercent","text":"Gaye ","code":""},{"path":"/reference/subsetHelper.html","id":null,"dir":"Reference","previous_headings":"","what":"Ensures that the requested subset is not larger than the original object — subsetHelper","title":"Ensures that the requested subset is not larger than the original object — subsetHelper","text":"Compares subset original object sizes eventually carries subsetting.","code":""},{"path":"/reference/subsetHelper.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Ensures that the requested subset is not larger than the original object — subsetHelper","text":"","code":"subsetHelper(dts, data, rs = NULL, cs = NULL)"},{"path":"/reference/subsetHelper.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Ensures that the requested subset is not larger than the original object — subsetHelper","text":"dts list DSConnection-class objects obtained login. datasources argument specified default set connections used: see datashield.connections_default. data character string specifying name data frame factor vector range subset. rs vector two integers specifying indices rows de extract. cs vector two integers one characters.","code":""},{"path":"/reference/subsetHelper.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Ensures that the requested subset is not larger than the original object — subsetHelper","text":"subsetHelper returns message class object object class studies.","code":""},{"path":"/reference/subsetHelper.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Ensures that the requested subset is not larger than the original object — subsetHelper","text":"function called function ds.subset ensure requested subset larger original object. function internal. Server function called: dimDS","code":""},{"path":"/reference/subsetHelper.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Ensures that the requested subset is not larger than the original object — subsetHelper","text":"","code":"if (FALSE) { # \\dontrun{ ## Version 6, for version 5 see the Wiki # connecting to the Opal servers require('DSI') require('DSOpal') require('dsBaseClient') builder <- DSI::newDSLoginBuilder() builder$append(server = \"study1\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM1\", driver = \"OpalDriver\") builder$append(server = \"study2\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM2\", driver = \"OpalDriver\") builder$append(server = \"study3\", url = \"http://192.168.56.100:8080/\", user = \"administrator\", password = \"datashield_test&\", table = \"CNSIM.CNSIM3\", driver = \"OpalDriver\") logindata <- builder$build() connections <- DSI::datashield.login(logins = logindata, assign = TRUE, symbol = \"D\") subsetHelper(dts = connections, data = \"D\", rs = 1:10, cs = c(\"D$LAB_TSC\",\"D$LAB_TRIG\")) # clear the Datashield R sessions and logout datashield.logout(connections) } # }"}] diff --git a/docs/sitemap.xml b/docs/sitemap.xml index fe21f864..c595c44a 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -102,7 +102,6 @@ /reference/ds.rNorm.html /reference/ds.rPois.html /reference/ds.rUnif.html -/reference/ds.ranksSecure.html /reference/ds.rbind.html /reference/ds.reShape.html /reference/ds.recodeLevels.html diff --git a/tests/testthat/perf_files/armadillo_azure-pipeline_perf-profile.csv b/tests/testthat/perf_files/armadillo_azure-pipeline_perf-profile.csv index cd65d3d1..63a6748b 100644 --- a/tests/testthat/perf_files/armadillo_azure-pipeline_perf-profile.csv +++ b/tests/testthat/perf_files/armadillo_azure-pipeline_perf-profile.csv @@ -2,9 +2,9 @@ "conndisconn::perf::simple0","0.1581","0.5","2" "ds.abs::perf::0","17.27","0.5","2" "ds.asCharacter::perf::0","16.84","0.5","2" -"ds.asDataMatrix::perf:0","17.44","0.5","2" +"ds.asDataMatrix::perf::0","17.44","0.5","2" "ds.asInteger::perf:0","17.61","0.5","2" -"ds.asList::perf:0","16.46","0.5","2" +"ds.asList::perf:0","22.52","0.5","2" "ds.asLogical::perf::0","17.46","0.5","2" "ds.asMatrix::perf::0","17.44","0.5","2" "ds.asNumeric::perf:0","16.79","0.5","2" @@ -14,7 +14,7 @@ "ds.completeCases::perf::combine:0","17.26","0.5","2" "ds.dim::perf::combine:0","23.82","0.5","2" "ds.exists::perf::combine:0","24.21","0.5","2" -"ds.exp::perf::combine:0","17.18","0.5","2" +"ds.exp::perf::0","17.43","0.5","2" "ds.isNA::perf::combine:0","23.86","0.5","2" "ds.length::perf::combine:0","24.04","0.5","2" "ds.levels::perf::combine:0","23.96","0.5","2" diff --git a/tests/testthat/perf_files/armadillo_hp-laptop-quay_perf-profile.csv b/tests/testthat/perf_files/armadillo_hp-laptop-quay_perf-profile.csv new file mode 100644 index 00000000..9080cd0c --- /dev/null +++ b/tests/testthat/perf_files/armadillo_hp-laptop-quay_perf-profile.csv @@ -0,0 +1,29 @@ +"refer_name","rate","lower_tolerance","upper_tolerance" +"conndisconn::perf::simple0","0.068","0.5","2" +"ds.abs::perf::0","5.690","0.5","2" +"ds.asCharacter::perf::0","4.916","0.5","2" +"ds.asDataMatrix::perf::0","4.916","0.5","2" +"ds.asInteger::perf:0","4.670","0.5","2" +"ds.asList::perf:0","8.738","0.5","2" +"ds.asLogical::perf::0","5.003","0.5","2" +"ds.asMatrix::perf::0","5.109","0.5","2" +"ds.asNumeric::perf:0","5.879","0.5","2" +"ds.assign::perf::0","3.030","0.5","2" +"ds.class::perf::combine:0","6.975","0.5","2" +"ds.colnames::perf:0","2.996","0.5","2" +"ds.completeCases::perf::combine:0","6.512","0.5","2" +"ds.dim::perf::combine:0","6.500","0.5","2" +"ds.exists::perf::combine:0","6.512","0.5","2" +"ds.exp::perf::combine:0","","0.5","2" +"ds.isNA::perf::combine:0","23.86","0.5","2" +"ds.length::perf::combine:0","24.04","0.5","2" +"ds.levels::perf::combine:0","9.246","0.5","2" +"ds.log::perf::0","17.30","0.5","2" +"ds.ls::perf::combine:0","8.000","0.5","2" +"ds.mean::perf::combine:0","7.978","0.5","2" +"ds.mean::perf::split:0","9.566","0.5","2" +"ds.names::perf::combine:0","9.500","0.5","2" +"ds.numNA::perf::combine:0","5.689","0.5","2" +"ds.sqrt::perf::0","5.688","0.5","2" +"ds.unique::perf::combine:0","6.300","0.5","2" +"void::perf::void::0","21100","0.5","2" diff --git a/tests/testthat/perf_files/armadillo_hp-laptop-quay_pipeline-perf.csv b/tests/testthat/perf_files/armadillo_hp-laptop-quay_pipeline-perf.csv deleted file mode 100644 index 9ac69853..00000000 --- a/tests/testthat/perf_files/armadillo_hp-laptop-quay_pipeline-perf.csv +++ /dev/null @@ -1,14 +0,0 @@ -"refer_name","rate","lower_tolerance","upper_tolerance" -"conndisconn::perf::simple0","0.04918","0.5","2" -"ds.abs::perf::0","1.184","0.5","2" -"ds.asInteger::perf:0","1.297","0.5","2" -"ds.asList::perf:0","2.884","0.5","2" -"ds.asNumeric::perf:0","1.354","0.5","2" -"ds.assign::perf::0","2.745","0.5","2" -"ds.class::perf::combine:0","3.261","0.5","2" -"ds.colnames::perf:0","2.404","0.5","2" -"ds.exists::perf::combine:0","6.342","0.5","2" -"ds.length::perf::combine:0","7.835","0.5","2" -"ds.mean::perf::combine:0","8.127","0.5","2" -"ds.mean::perf::split:0","8.109","0.5","2" -"void::perf::void::0","20280.0","0.5","2"