--- permalink: /governance/index.html title: "Governance - Godot Engine" description: "Governance model." layout: more header_text: "Governance model" current_tab: "governance" ---
On its own, Godot has no legal status. Godot exists as a member project of the Software Freedom Conservancy (SFC). The SFC provides a home and infrastructure for Free, Libre, and Open Source Software (FLOSS) projects by aggregating the work necessary for running a non-profit organization including accounting and legal compliance. For more information about what the SFC provides, please refer to their website.
As no company is behind Godot, it can't be sold or purchased by another company.
While the SFC provides the corporate infrastructure to support the Godot project, it doesn't make decisions for the project. Instead it provides a set of rules for how the member projects operate and provides financial oversight to make sure that money is spent in a responsible way that advances the project and fits with Conservancy's 501(c)(3) mission to promote, advance, and defend software freedom. Each member project has a Project Leadership Committee that instructs the SFC on how to spend that project's funding.
The Project Leadership Committee (PLC) is responsible for making all funding and institutional decisions for the Godot project. The PLC is made of the project founders (Ariel Manzur and Juan Linietsky) as well as trusted contributors and community members. As spaces open up on the PLC, current members may reach out to contributors and community members with a proven track record and deep understanding of the project and ask them to join.
The PLC must be made of a balance of contributors with technical expertise, and community members who bring the perspective of the community at large. The PLC is subject to rules set by the Software Freedom Conservancy. For more information about the PLC's policies please refer to the Software Freedom Conservancy's project policies.
The PLC currently consists of the following members:
The PLC has enlisted the help of its most trusted and veteran contributors whom they call the advisors. The advisors are consulted on usage of funds as well as institutional matters. It is important to note, however, that while the advice of the advisory panel is weighed heavily, the final authority on these matters remains with the PLC. In practice, the PLC rarely makes an important decision without at least discussing it with the advisors first.
Like the PLC, contributors do not apply to become advisors. Instead the process of joining the advisors group is organic; trusted contributors may be asked to join after showing dedication, expertise, and leadership within the Godot community. As a result, the advisors are a diverse group of individuals with expertise in all areas of Godot development.
All donations and sponsorships go directly to the SFC. The Godot PLC makes all decisions on how the funds are used, following rules established by Software Freedom Conservancy. These rules dictate that funding can only be used for the benefit of the project. Usage of funds generally includes:
While the exact costs spent remain private, we do our best to publish how much we get and how much we spend. All funding decisions are ultimately approved by the Software Freedom Conservancy which has strict (but reasonable) limits on spending, hourly rates, and reimbursements. As such, no one hired receives more than industry standard rates.
Technical decisions are made by Area Owners and the project leaders. Godot has the following established roles:
The project leaders have final say on all code merges. In theory, this means the leaders will have the final say when maintainers cannot agree. In practice, this authority rarely needs to be invoked because decisions are made by maintainers in consultation with the community.
Engine teams are groups of contributors interested in a specific area of the engine. Teams provide a way for contributors to have focused discussions with other people with similar expertise and interests. The opinion and expertise of team members is valued in discussions, but ultimately the authority over an area of the engine belongs solely to the area owner and the project leadership. Area owners are entrusted with final say for code merges in their areas. Area owners are trusted contributors who are chosen by the project leadership and have shown knowledge of the specific area of the engine and the engine's philosophy as a whole.
In practice, area owners aim for consensus among contributors, especially among the relevant team. The "rule of thumb" is to not merge code if significant disputes exist over a change. However the final decision still remains with the area owner. The Godot project strives for rich, public, technical discussions where anyone can contribute and agree on the way to move forward. Additionally, the leadership and area owners consult with other contributors and the community as much as possible every time new features and improvements are planned.
We strive to make our relationship with the community as symbiotic as possible within the limits of feasibility. The Godot community is made up of users, contributors, maintainers, and project leadership. Godot exists because its community trusts the work we do, so we try to entrust the community with deciding the general direction of the project as much and as openly as possible. This is how we see the process as community-driven:
Every improvement to the engine, whether it is a feature or bug fix, is driven forward by Godot's community of contributors, users, maintainers, and leadership. Godot wouldn't exist in its current form without the countless contributions it receives from community members every day.


--- layout: cohort title: Cohort 1 | Student Work cohortlink: one cohort: ONE ---
At SJP, we take pride in our what we create. Here are some outstanding examples of what we have achieved
Essays
Oral Histories
Wiki Pages


--- layout: not_homepage quote: If I have seen further it is by standing on ye sholders of Giants. author: Issac Newton --- {% include quote.html quote=page.quote author=page.author %}


swagger_server.controllers.operational_controller module¶
-
swagger_server.controllers.operational_controller.
delete_user_data
(user_id)[source]¶ - # noqa: E501
Parameters: user_id (dict | bytes) – A UUID value identifying the user. Return type: UserDeletionData
-
swagger_server.controllers.operational_controller.
get_all_user_roles
(user_id)[source]¶ Get the effective roles that a user has at any place in the organisational tree. # noqa: E501
Parameters: user_id (dict | bytes) – A UUID value identifying the user. Return type: AllUserRoles
-
swagger_server.controllers.operational_controller.
get_domain_roles
(domain_id)[source]¶ Get the domain and its lineage's roles defined for a domain. # noqa: E501
Parameters: domain_id (int) – A unique integer value identifying the domain. Return type: DomainRoles
-
swagger_server.controllers.operational_controller.
get_resource_permissions_for_roles
(role_ids)[source]¶ Get a list of all resource permissions the specified roles have. # noqa: E501
Parameters: role_ids (List[int]) – Return type: List[ResourcePermission]
-
swagger_server.controllers.operational_controller.
get_site_and_domain_roles
(site_id)[source]¶ Get the site- and domain lineage roles defined for a given site. # noqa: E501
Parameters: site_id (int) – A unique integer value identifying the site. Return type: SiteAndDomainRoles
-
swagger_server.controllers.operational_controller.
get_site_role_labels_aggregated
(site_id)[source]¶ Get a list of all possible role labels that a user can have from the specified site's perspective. # noqa: E501
Parameters: site_id (int) – A unique integer value identifying the site. Return type: SiteRoleLabelsAggregated
-
swagger_server.controllers.operational_controller.
get_sites_under_domain
(domain_id)[source]¶ Get a list of all sites linked directly or indirectly to the specified domain. # noqa: E501
Parameters: domain_id (int) – A unique integer value identifying the domain. Return type: List[Site]
-
swagger_server.controllers.operational_controller.
get_tech_admin_resource_permissions
()[source]¶ Get a list of all possible permissions any user can have. This is effectively what a tech admin user can do. # noqa: E501
Return type: List[ResourcePermission]
-
swagger_server.controllers.operational_controller.
get_user_site_role_labels_aggregated
(user_id, site_id)[source]¶ Get a list of all role labels that the specified user has from the specified site's perspective. # noqa: E501
Parameters: - user_id (dict | bytes) – A UUID value identifying the user.
- site_id (int) – A unique integer value identifying the site.
Return type:
-
swagger_server.controllers.operational_controller.
get_users_with_roles_for_domain
(domain_id)[source]¶ Get a list of Users with their effective roles within the given domain. # noqa: E501
Parameters: domain_id (int) – A unique integer value identifying the domain. Return type: List[UserWithRoles]
-
swagger_server.controllers.operational_controller.
get_users_with_roles_for_site
(site_id)[source]¶ Get a list of Users with their effective roles within the given site. # noqa: E501
Parameters: site_id (int) – A unique integer value identifying the site. Return type: List [UserWithRoles]
-
swagger_server.controllers.operational_controller.
healthcheck
()[source]¶ Get the status of the service. # noqa: E501
Return type: HealthInfo
-
swagger_server.controllers.operational_controller.
purge_expired_invitations
(cutoff_date=None)[source]¶ Purge all the expired invitations past a cutoff_date (defaults to today).
Parameters: cutoff_date (date) – An optional cutoff_date to purge invitations expired past this date. Return type: PurgedInvitations


New game
Bowling Scorecard
Game total
0
Frame 1
1st roll
Enter
2nd roll
Enter
0
Frame 2
1st roll
Enter
2nd roll
Enter
0
Frame 3
1st roll
Enter
2nd roll
Enter
0
Frame 4
1st roll
Enter
2nd roll
Enter
0
Frame 5
1st roll
Enter
2nd roll
Enter
0
Frame 6
1st roll
Enter
2nd roll
Enter
0
Frame 7
1st roll
Enter
2nd roll
Enter
0
Frame 8
1st roll
Enter
2nd roll
Enter
0
Frame 9
1st roll
Enter
2nd roll
Enter
0
Frame 10
1st roll
Enter
2nd roll
Enter
0
Bonus roll 1
Enter
Bonus roll 2
Enter


crypto-Kart is guided by four principles: customer obsession rather than competitor focus, passion for invention, commitment to operational excellence, and long-term thinking. Crypto-kart strives to be Earth’s Most Customer-Centric Company, Earth’s Best Employer, and Earth’s Safest Place to Work. Customer reviews, 1-Click shopping and personalized recommendations.
E-commerce is revolutionizing the way we all shop. Why do you want to hop from one store to another in search of the latest phone when you can find it on the Internet in a single click? Not only mobiles. Crypto-kart houses everything you can possibly imagine, from trending electronics like laptops, tablets, smartphones, and mobile accessories to in-vogue fashion staples like shoes, clothing and lifestyle accessories; from modern furniture like sofa sets, dining tables, and wardrobes.
We follow the latest on going trend and craze for cryptocurrency and accepts Ethereum as payment


4 Philadelphia shootings in 4 hours leave at least 2 dead, reports say
by Talia KaplanAs many as four shootings unfolded in the span of just four hours late Saturday night into early Sunday morning in Philadelphia, leaving two people dead, according to reports.
The violence began around 11 p.m. Saturday when a 33-year-old man was shot in the back on Hartville Street. Paramedics took him to a hospital in stable condition, WPVI-TV reported.
About an hour and a half later, a 22-year-old man and a 20-year-old woman reportedly were shot while sitting in a car in Philadelphia’s Germantown neighborhood. The unidentified man was hit three times; once in the head, shoulder and chest, Fox 29 reported, adding that the 22-year-old was pronounced dead at a hospital.
The woman reportedly was shot once in the foot and was hospitalized in stable condition.
After the man was shot, he drove off and later crashed his car into several parked cars, the station reported, citing police.
The shooter allegedly fired 15 shots into the car, WPVI-TV reported.
No arrest have been reported.
Around 2:30 a.m., the Philadelphia Police Department reportedly responded to another shooting just two miles away. In that incident, two men were shot as they were sitting in a car at a red light in the city’s Hunting Park neighborhood, according to WPVI-TV.
PENNSYLVANIA 11-MONTH-OLD SHOT 4 TIMES WHILE SITTING IN CAR, POLICE SAY
The station reported that the two men got into an argument with the people in the car next to them when someone in the other car pulled out a rifle and fired, injuring both men in the other car.
A 32-year-old man with a gunshot wound to the chest reportedly managed to drive to a nearby hospital and was listed in critical condition. His 27-year-old passenger died from three gunshot wounds to the head, the news outlet reported, attributing police.
The man who died has not yet been identified and no arrests have been reported, according to Fox 29's reporting.
About a half-hour later, another shooting in Hunting Park was reported.
CLICK HERE TO GET THE FOX NEWS APP
A 42-year-old man was shot multiple times in his lower body and paramedics rushed him to a hospital in critical condition, police said.
Investigators reportedly were looking into whether all the shootings were connected.


المُفَوّض or The MUFAwwad is the engine of this library. it handles creation of Mufa instances.
(Registry)
: The store
import {on, fire} from 'mufa';
// publish
setTimeout(() => {
fire('sendEmoji', '👏')
}, 1000) ;
// subscribe
on('sendEmoji', (emoji) => console.log(emoji));
Subscribe to event and save the callback to be running when the event is published (fired)
(String)
event name
(Function)
callback to be running when the event is published
(Boolean?
= false
)
it restricts subscriber's notification only for the 1ˢᵗ publish
Subscription
:
Subscription's info
Cancel the subscription which was done with "sub" or "one" or "once"
(Subscription)
One subscription for each argument
Array<Subscription>
:
arguments
Subscribe to event and save the callback to be running when the event is published (fired).
It is an alias of mufa.sub
Subscription
:
Subscription's info
Subscribe once to event and save the callback to be running when the event is published (fired)
It is almost an alias of mufa.sub.
Subscription
:
Subscription's info
Publish (fire) an event & notify event's subscribers immediatly.
It is an alias of mufa.pub
(String)
The event name
(any)
message(s) to be sent to subscribers
undefined
:
Cancel the subscription which was done with "sub" or "one" or "once" It is an alias of mufa.unsub.
(Subscription)
One subscription for each argument
Array<Subscription>
:
arguments
Type: Object


City of Philadelphia
Mayor's Office
City government directory
Google Translate
Skip to main content
Services
Programs & initiatives
News & events
Publications & forms
Search
Menu
Phila.gov home
Service directory
Programs & initiatives
News & events
Publications & forms
Mayor's Office
City government directory


TABLE OF INTERACTIONS WITH
BETA-BLOCKING AGENTS (EXCEPT ESMOLOL AND SOTALOL)
From the French ANSM drug interactions document of September 2016, p. 41
BETA BLOCKING AGENTS (EXCEPT ESMOLOL AND SOTALOL) CLASS CODE: C07AB-001 |
AMIODARONE RxNorm: 703 ATC: C01BD01 |
Disorders of autoregulation and conduction (suppression of the compensatory sympathetic mechanisms) |
Precaution for use Clinical monitoring and EKG |
BETA BLOCKING AGENTS (EXCEPT ESMOLOL AND SOTALOL) CLASS CODE: C07AB-001 |
CLASS I ANTIARRHYTHMICS (EXCEPT LIDOCAINE) CLASS CODE: C01B-003 |
Disorders of contractility, autoregulation, and electrical conduction (suppression of the compensatory sympathetic mechanisms) |
Precaution for use Clinical monitoring and EKG |


COVID19 Transit Map
Para Transit
Date:
Timestamp:
+
Incubation lag:
Show L pattern
Show k pattern
Show decay duration pattern
Show distance pattern
Show half-life pattern
field to be visualized:
title:
Show selected fields


{% load staticfiles %}
Welcome to Houqiang Li and Wengang Zhou's Lab homepage.
Our research group is in Lab of Multimedia Computing and Communication (MCC), University of Science and Technology of China (USTC). Research in our lab mainly focus on image/video coding, multimedia retrieval, video understanding, and computer vision. Especially, our research projects include image retrieval, action recognition, sign language recognition, tracking, etc.


{% extends "registration/base.html" %} {% block title %}Registration complete{% endblock %} {% block registration %}
An activation link has been sent to the email address you supplied, along with instructions for activating your account.
{% endblock %}


Create batch
Name:
Code count:
Start date
End date
Owner
Create
All batches:
Batch details:
Authorize


Apple To Remove Vaping Apps From Store
by msmashAmid growing health concerns over e-cigarettes, Apple will remove all 181 vaping-related apps from its mobile App Store this morning, Axios reports. From a report: The move comes after at least 42 people have died from vaping-related lung illness, per the CDC. Most of those people had been using cartridges containing THC, though some exclusively used nicotine cartridges. The company has never allowed the sale of vape cartridges directly from apps. But there were apps that let people control the temperature and lighting of their vape pens, and others provided vaping-related news, social networks and games.


bazil.org/fuse
is a Go library for writing filesystems. It is a
from-scratch implementation of the kernel-userspace communication
protocol, and does not use the C library from the project called
FUSE. bazil.org/fuse
embraces Go
fully for safety and ease of programming.
Here’s how to get going:
go get bazil.org/fuse
Github repository: https://github.com/bazil/fuse
API docs: http://godoc.org/bazil.org/fuse
Our thanks to Russ Cox for his fuse library, which this project is based on.


Metadata Resources
The IMS Metadata specification was one of the first to be produced and as such it is well supported. The best place to start is probably the Metadata SIG section of the CETIS web site: http://metadata.cetis.ac.uk/
Metadata Guide
One of the most useful resources on the Metadata SIG site is the http://metadata.cetis.ac.uk/guides/guide.doc.
UK Learning Object Metadata Framework (draft)
Previously referred to as the UK Common Metadata Framework, this is a set of guidelines to inform UK practitioners wishing to implement the IEEE LOM in such a way as to provide maximum benefit for the UK educational community.http://www.cetis.ac.uk/profiles/uklomcore.


Check for available engine updates
endpoint
versions)
same image as currently running)
engine images are pulled (default
"docker.io/store/docker")


Take one minute to think about what you need, what you value, and what is important to you and your community.
Dream about the ideal future. How might the environment change so that we are all free to pursue our personal and shared dreams and goals?
What does your: Community, Region, and/or World look like?


--- layout: layout-panels description: SKY UX includes guidelines to describe how to apply components and the context for when to use them. order: 4 ---
{{ stache.config.product_name_short }} is more than a set of user interface components. Equally important for a consistent experience, it includes guidelines to describe how to apply components and the context for when to use them.


The aim of our venture is to establish a new way of reading - and writing - books. We seek to create a new way of consuming and appreciating literature.
To put it simply: we look for authors who are willing to write their next book in complete transparency. That is, to allow the world a peek at their computer screen from the minute they put their first word, their first letter, on the blank "Word" page, following every step they make, every hesitation, every change and every typo, to the last word.
The online readers could follow the writer's work in real time or later on, by using a "Playback" function at regular speed or with fast forward. Every move in the writing process would be recorded and could be reconstructed for the site's subscribers. This way they could, for the first time, follow the dynamics of the writing process of their favorite authors and have an intimate, unprecedented look, into their creativity.
The readers/viewers/followers would pay for this experience at the same price they would pay for the printed edition of the book. At the end of the process they would receive, in addition to access to the site, either a printed copy or an e-version of the book, according to their preference. The site would stay open long after the book is written so that new curious subscribers could recover the writing process of a favorite work they've just read. This "Black Box" could be sold separately or with the e-book itself, very much as the "Director's version" or the "Making of" is added to many DVD's.
We believe that even an established writer would greatly benefit from this opportunity. It will be a revolutionary event in both literature and on the internet, commanding the attention of a wider audience.
Equally as important, the participating writer will be able to create a new, intimate and sincere dialog with the readers without sacrificing his or her privacy. It is a pure literary experience we are offering: letting the book sell itself: the writing - not the writer.
On a practical level, it is a means of selling books directly, on a significant scale, and in advance. No need for cash advances from publishing houses. All the writers have to do in order to achieve this, is to write their books as they would normally do.
The participating writer would have to consider both the opportunities and the challenges: Opportunities, since a dynamic on-line book opens endless Borgesian forking paths for the resourceful author; Challenges, since not everyone could stand this attention at the early stages of their work.
The participating writer would have to consider both the opportunities and the challenges: Opportunities, since a dynamic on-line book opens endless Borgesian forking paths for the resourceful author; Challenges, since not everyone could stand this attention at the early stages of their work.
Any ideas?


Structuring code that is robust to updates in the data, changes in
methodological specifications, etc., and can get to presentation-ready
results in an automated way can mitigate errors caused by painful,
tedious tasks–it can also be a huge time saver. The cheese
package was designed with this philosophy in mind, heavily influenced by
(and explicit dependencies on) tidy
concepts. Its
intention is to provide general tools for working with data and results
during statistical analysis, in addition to a collection of functions
designated for specific statistical tasks.
Let’s take a closer look:
## Loading required package: cheese
This data comes from the UCI Machine Learning Repository, containing a collection of demographic and clinical characteristics from 303 patients. It was subsequently processed and cleaned into a format suitable for analysis–details of which can be found here.
#Look at the data
heart_disease
## # A tibble: 303 × 9
## Age Sex ChestPain BP Cholest…¹ Blood…² Maxim…³ Exerc…⁴ Heart…⁵
## <dbl> <fct> <fct> <dbl> <dbl> <lgl> <dbl> <fct> <fct>
## 1 63 Male Typical angina 145 233 TRUE 150 No No
## 2 67 Male Asymptomatic 160 286 FALSE 108 Yes Yes
## 3 67 Male Asymptomatic 120 229 FALSE 129 Yes Yes
## 4 37 Male Non-anginal pain 130 250 FALSE 187 No No
## 5 41 Female Atypical angina 130 204 FALSE 172 No No
## 6 56 Male Atypical angina 120 236 FALSE 178 No No
## 7 62 Female Asymptomatic 140 268 FALSE 160 No Yes
## 8 57 Female Asymptomatic 120 354 FALSE 163 Yes No
## 9 63 Male Asymptomatic 130 254 FALSE 147 No Yes
## 10 53 Male Asymptomatic 140 203 TRUE 155 Yes Yes
## # … with 293 more rows, and abbreviated variable names ¹Cholesterol,
## # ²BloodSugar, ³MaximumHR, ⁴ExerciseInducedAngina, ⁵HeartDisease
The functions that will be introduced are roughly in order of their
development, as many build off of one another. Selection of columns is
done with non-standard evaluation (NSE) or with
tidyselect::select_helpers
, where applicable.
divide()
is used to split up a data frame into a list of
subsets. Suppose you want to split the example data set by sex and heart
disease status:
## $Female
## $Female$No
## # A tibble: 72 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 41 Atypical angina 130 204 FALSE 172 No
## 2 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 56 Atypical angina 140 294 FALSE 153 No
## 4 48 Non-anginal pain 130 275 FALSE 139 No
## 5 58 Typical angina 150 283 TRUE 162 No
## 6 50 Non-anginal pain 120 219 FALSE 158 No
## 7 58 Non-anginal pain 120 340 FALSE 172 No
## 8 66 Typical angina 150 226 FALSE 114 No
## 9 69 Typical angina 140 239 FALSE 151 No
## 10 71 Atypical angina 160 302 FALSE 162 No
## # … with 62 more rows, and abbreviated variable name ¹ExerciseInducedAngina
##
## $Female$Yes
## # A tibble: 25 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 62 Asymptomatic 140 268 FALSE 160 No
## 2 65 Asymptomatic 150 225 FALSE 114 No
## 3 61 Asymptomatic 130 330 FALSE 169 No
## 4 51 Asymptomatic 130 305 FALSE 142 Yes
## 5 62 Asymptomatic 160 164 FALSE 145 No
## 6 60 Asymptomatic 150 258 FALSE 157 No
## 7 61 Asymptomatic 145 307 FALSE 146 Yes
## 8 43 Asymptomatic 132 341 TRUE 136 Yes
## 9 62 Non-anginal pain 130 263 FALSE 97 No
## 10 63 Asymptomatic 150 407 FALSE 154 No
## # … with 15 more rows, and abbreviated variable name ¹ExerciseInducedAngina
##
##
## $Male
## $Male$No
## # A tibble: 92 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 63 Typical angina 145 233 TRUE 150 No
## 2 37 Non-anginal pain 130 250 FALSE 187 No
## 3 56 Atypical angina 120 236 FALSE 178 No
## 4 57 Asymptomatic 140 192 FALSE 148 No
## 5 44 Atypical angina 120 263 FALSE 173 No
## 6 52 Non-anginal pain 172 199 TRUE 162 No
## 7 57 Non-anginal pain 150 168 FALSE 174 No
## 8 54 Asymptomatic 140 239 FALSE 160 No
## 9 49 Atypical angina 130 266 FALSE 171 No
## 10 64 Typical angina 110 211 FALSE 144 Yes
## # … with 82 more rows, and abbreviated variable name ¹ExerciseInducedAngina
##
## $Male$Yes
## # A tibble: 114 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 67 Asymptomatic 160 286 FALSE 108 Yes
## 2 67 Asymptomatic 120 229 FALSE 129 Yes
## 3 63 Asymptomatic 130 254 FALSE 147 No
## 4 53 Asymptomatic 140 203 TRUE 155 Yes
## 5 56 Non-anginal pain 130 256 TRUE 142 Yes
## 6 48 Atypical angina 110 229 FALSE 168 No
## 7 58 Atypical angina 120 284 FALSE 160 No
## 8 58 Non-anginal pain 132 224 FALSE 173 No
## 9 60 Asymptomatic 130 206 FALSE 132 Yes
## 10 40 Asymptomatic 110 167 FALSE 114 Yes
## # … with 104 more rows, and abbreviated variable name ¹ExerciseInducedAngina
The default behavior is to continually split the data in a
hierarchical structure based on the order of the input columns, and to
remove them from the result. The keep
argument can be used
to retain the column(s) in the data frames.
fasten()
allows you to take a list structure that
contains data frames at an arbitrary depth, and roll them back up into a
single data frame. This is useful when a statistical process needs to be
mapped to many subsets, and you want to be able to easily collect the
results without repeatedly binding data. You can call the function with
the divided data from above:
## # A tibble: 303 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 41 Atypical angina 130 204 FALSE 172 No
## 2 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 56 Atypical angina 140 294 FALSE 153 No
## 4 48 Non-anginal pain 130 275 FALSE 139 No
## 5 58 Typical angina 150 283 TRUE 162 No
## 6 50 Non-anginal pain 120 219 FALSE 158 No
## 7 58 Non-anginal pain 120 340 FALSE 172 No
## 8 66 Typical angina 150 226 FALSE 114 No
## 9 69 Typical angina 140 239 FALSE 151 No
## 10 71 Atypical angina 160 302 FALSE 162 No
## # … with 293 more rows, and abbreviated variable name ¹ExerciseInducedAngina
It was binded back to the original number of rows, but it lost the
columns it was split by. The into
argument can be used to
handle this:
## # A tibble: 303 × 9
## Sex HeartDisease Age ChestPain BP Chole…¹ Blood…² Maxim…³ Exerc…⁴
## <chr> <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 Female No 41 Atypical ang… 130 204 FALSE 172 No
## 2 Female No 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 Female No 56 Atypical ang… 140 294 FALSE 153 No
## 4 Female No 48 Non-anginal … 130 275 FALSE 139 No
## 5 Female No 58 Typical angi… 150 283 TRUE 162 No
## 6 Female No 50 Non-anginal … 120 219 FALSE 158 No
## 7 Female No 58 Non-anginal … 120 340 FALSE 172 No
## 8 Female No 66 Typical angi… 150 226 FALSE 114 No
## 9 Female No 69 Typical angi… 140 239 FALSE 151 No
## 10 Female No 71 Atypical ang… 160 302 FALSE 162 No
## # … with 293 more rows, and abbreviated variable names ¹Cholesterol,
## # ²BloodSugar, ³MaximumHR, ⁴ExerciseInducedAngina
The positions of the into
values always lineup with the
level of the list hierarchy. So, for example, if you don’t care about
retaining the heart disease status, you can do this:
## # A tibble: 303 × 8
## Sex Age ChestPain BP Cholesterol BloodSugar MaximumHR Exerci…¹
## <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 Female 41 Atypical angina 130 204 FALSE 172 No
## 2 Female 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 Female 56 Atypical angina 140 294 FALSE 153 No
## 4 Female 48 Non-anginal pain 130 275 FALSE 139 No
## 5 Female 58 Typical angina 150 283 TRUE 162 No
## 6 Female 50 Non-anginal pain 120 219 FALSE 158 No
## 7 Female 58 Non-anginal pain 120 340 FALSE 172 No
## 8 Female 66 Typical angina 150 226 FALSE 114 No
## 9 Female 69 Typical angina 140 239 FALSE 151 No
## 10 Female 71 Atypical angina 160 302 FALSE 162 No
## # … with 293 more rows, and abbreviated variable name ¹ExerciseInducedAngina
In contrast, if you want to forgo the sex indicator, empty strings will need to be used as placeholders so the names are applied at the correct levels.
## # A tibble: 303 × 8
## HeartDisease Age ChestPain BP Cholesterol Blood…¹ Maxim…² Exerc…³
## <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 No 41 Atypical angina 130 204 FALSE 172 No
## 2 No 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 No 56 Atypical angina 140 294 FALSE 153 No
## 4 No 48 Non-anginal pain 130 275 FALSE 139 No
## 5 No 58 Typical angina 150 283 TRUE 162 No
## 6 No 50 Non-anginal pain 120 219 FALSE 158 No
## 7 No 58 Non-anginal pain 120 340 FALSE 172 No
## 8 No 66 Typical angina 150 226 FALSE 114 No
## 9 No 69 Typical angina 140 239 FALSE 151 No
## 10 No 71 Atypical angina 160 302 FALSE 162 No
## # … with 293 more rows, and abbreviated variable names ¹BloodSugar, ²MaximumHR,
## # ³ExerciseInducedAngina
Obviously, the classes of the split columns are not retained from the original data since the splitting and binding processes are independent.
As shown above, the default behavior for these functions is to split
or bind “as much as possible”. However, it can be useful to have control
over the shape of the split. This is where the depth
argument comes in. Suppose you want the same data frames at the leaves
of the list, but only one level deep:
## $`Female|No`
## # A tibble: 72 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 41 Atypical angina 130 204 FALSE 172 No
## 2 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 56 Atypical angina 140 294 FALSE 153 No
## 4 48 Non-anginal pain 130 275 FALSE 139 No
## 5 58 Typical angina 150 283 TRUE 162 No
## 6 50 Non-anginal pain 120 219 FALSE 158 No
## 7 58 Non-anginal pain 120 340 FALSE 172 No
## 8 66 Typical angina 150 226 FALSE 114 No
## 9 69 Typical angina 140 239 FALSE 151 No
## 10 71 Atypical angina 160 302 FALSE 162 No
## # … with 62 more rows, and abbreviated variable name ¹ExerciseInducedAngina
##
## $`Male|No`
## # A tibble: 92 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 63 Typical angina 145 233 TRUE 150 No
## 2 37 Non-anginal pain 130 250 FALSE 187 No
## 3 56 Atypical angina 120 236 FALSE 178 No
## 4 57 Asymptomatic 140 192 FALSE 148 No
## 5 44 Atypical angina 120 263 FALSE 173 No
## 6 52 Non-anginal pain 172 199 TRUE 162 No
## 7 57 Non-anginal pain 150 168 FALSE 174 No
## 8 54 Asymptomatic 140 239 FALSE 160 No
## 9 49 Atypical angina 130 266 FALSE 171 No
## 10 64 Typical angina 110 211 FALSE 144 Yes
## # … with 82 more rows, and abbreviated variable name ¹ExerciseInducedAngina
##
## $`Female|Yes`
## # A tibble: 25 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 62 Asymptomatic 140 268 FALSE 160 No
## 2 65 Asymptomatic 150 225 FALSE 114 No
## 3 61 Asymptomatic 130 330 FALSE 169 No
## 4 51 Asymptomatic 130 305 FALSE 142 Yes
## 5 62 Asymptomatic 160 164 FALSE 145 No
## 6 60 Asymptomatic 150 258 FALSE 157 No
## 7 61 Asymptomatic 145 307 FALSE 146 Yes
## 8 43 Asymptomatic 132 341 TRUE 136 Yes
## 9 62 Non-anginal pain 130 263 FALSE 97 No
## 10 63 Asymptomatic 150 407 FALSE 154 No
## # … with 15 more rows, and abbreviated variable name ¹ExerciseInducedAngina
##
## $`Male|Yes`
## # A tibble: 114 × 7
## Age ChestPain BP Cholesterol BloodSugar MaximumHR ExerciseInduc…¹
## <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 67 Asymptomatic 160 286 FALSE 108 Yes
## 2 67 Asymptomatic 120 229 FALSE 129 Yes
## 3 63 Asymptomatic 130 254 FALSE 147 No
## 4 53 Asymptomatic 140 203 TRUE 155 Yes
## 5 56 Non-anginal pain 130 256 TRUE 142 Yes
## 6 48 Atypical angina 110 229 FALSE 168 No
## 7 58 Atypical angina 120 284 FALSE 160 No
## 8 58 Non-anginal pain 132 224 FALSE 173 No
## 9 60 Asymptomatic 130 206 FALSE 132 Yes
## 10 40 Asymptomatic 110 167 FALSE 114 Yes
## # … with 104 more rows, and abbreviated variable name ¹ExerciseInducedAngina
You now have list with four elements containing the subsets–the names
of which are the concatenated levels of the split columns (see the
sep
argument).
This argument also works when binding data. Going back to the original divided data frame, you may only want to bind the internal lists.
## $Female
## # A tibble: 97 × 8
## HeartDisease Age ChestPain BP Cholesterol Blood…¹ Maxim…² Exerc…³
## <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 No 41 Atypical angina 130 204 FALSE 172 No
## 2 No 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 No 56 Atypical angina 140 294 FALSE 153 No
## 4 No 48 Non-anginal pain 130 275 FALSE 139 No
## 5 No 58 Typical angina 150 283 TRUE 162 No
## 6 No 50 Non-anginal pain 120 219 FALSE 158 No
## 7 No 58 Non-anginal pain 120 340 FALSE 172 No
## 8 No 66 Typical angina 150 226 FALSE 114 No
## 9 No 69 Typical angina 140 239 FALSE 151 No
## 10 No 71 Atypical angina 160 302 FALSE 162 No
## # … with 87 more rows, and abbreviated variable names ¹BloodSugar, ²MaximumHR,
## # ³ExerciseInducedAngina
##
## $Male
## # A tibble: 206 × 8
## HeartDisease Age ChestPain BP Cholesterol Blood…¹ Maxim…² Exerc…³
## <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 No 63 Typical angina 145 233 TRUE 150 No
## 2 No 37 Non-anginal pain 130 250 FALSE 187 No
## 3 No 56 Atypical angina 120 236 FALSE 178 No
## 4 No 57 Asymptomatic 140 192 FALSE 148 No
## 5 No 44 Atypical angina 120 263 FALSE 173 No
## 6 No 52 Non-anginal pain 172 199 TRUE 162 No
## 7 No 57 Non-anginal pain 150 168 FALSE 174 No
## 8 No 54 Asymptomatic 140 239 FALSE 160 No
## 9 No 49 Atypical angina 130 266 FALSE 171 No
## 10 No 64 Typical angina 110 211 FALSE 144 Yes
## # … with 196 more rows, and abbreviated variable names ¹BloodSugar, ²MaximumHR,
## # ³ExerciseInducedAngina
Note that the positions of the into
values are directly
related to how shallow/deep you want the result to be.
The depth can also be controlled relative to the leaves by using negative integers. This can be useful if it is unclear how deep the list will be (or is). In the example above, suppose you didn’t know how deep the list was, but you knew the heart disease status was the most internal split, and thus wanted to bind it.
## $Female
## # A tibble: 97 × 8
## HeartDisease Age ChestPain BP Cholesterol Blood…¹ Maxim…² Exerc…³
## <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 No 41 Atypical angina 130 204 FALSE 172 No
## 2 No 57 Asymptomatic 120 354 FALSE 163 Yes
## 3 No 56 Atypical angina 140 294 FALSE 153 No
## 4 No 48 Non-anginal pain 130 275 FALSE 139 No
## 5 No 58 Typical angina 150 283 TRUE 162 No
## 6 No 50 Non-anginal pain 120 219 FALSE 158 No
## 7 No 58 Non-anginal pain 120 340 FALSE 172 No
## 8 No 66 Typical angina 150 226 FALSE 114 No
## 9 No 69 Typical angina 140 239 FALSE 151 No
## 10 No 71 Atypical angina 160 302 FALSE 162 No
## # … with 87 more rows, and abbreviated variable names ¹BloodSugar, ²MaximumHR,
## # ³ExerciseInducedAngina
##
## $Male
## # A tibble: 206 × 8
## HeartDisease Age ChestPain BP Cholesterol Blood…¹ Maxim…² Exerc…³
## <chr> <dbl> <fct> <dbl> <dbl> <lgl> <dbl> <fct>
## 1 No 63 Typical angina 145 233 TRUE 150 No
## 2 No 37 Non-anginal pain 130 250 FALSE 187 No
## 3 No 56 Atypical angina 120 236 FALSE 178 No
## 4 No 57 Asymptomatic 140 192 FALSE 148 No
## 5 No 44 Atypical angina 120 263 FALSE 173 No
## 6 No 52 Non-anginal pain 172 199 TRUE 162 No
## 7 No 57 Non-anginal pain 150 168 FALSE 174 No
## 8 No 54 Asymptomatic 140 239 FALSE 160 No
## 9 No 49 Atypical angina 130 266 FALSE 171 No
## 10 No 64 Typical angina 110 211 FALSE 144 Yes
## # … with 196 more rows, and abbreviated variable names ¹BloodSugar, ²MaximumHR,
## # ³ExerciseInducedAngina
The new depth is one less than the input. In this case, the same result was achieved because of the symmetry.
The next set of functions are rooted in functional programming
(i.e. purrr
). In
each instance, given a pre-defined function, you can easily control the
scope of the data in which it is evaluated on. This is an incredibly
useful and efficient philosophy for generating reusable code that is
non-repetitive.
Often times a statistical analysis is concerned with multiple
outcomes/targets, though each one potentially uses the same set of
explanatory variables. You could of course hard code the specific
analysis steps for each outcome (e.g. formulas, etc.), but then the code
becomes repetitive. You could also make separate data sets for each
outcome with the associated predictors and then apply the same analysis
process to each data set, but then you waste resources by storing
multiple copies of the same data in memory. dish()
allows
you to distribute a function to various pairwise sets of columns from
the same data set in a single call. The motivation described above is
merely that–this is a general function that can be applied to any
context.
As a simple first example, lets compute the Pearson correlation of blood pressure and cholesterol with all numeric columns:
## $BP
## $BP$Age
## [1] 0.2849459
##
## $BP$BP
## [1] 1
##
## $BP$Cholesterol
## [1] 0.1301201
##
## $BP$MaximumHR
## [1] -0.04535088
##
##
## $Cholesterol
## $Cholesterol$Age
## [1] 0.2089503
##
## $Cholesterol$BP
## [1] 0.1301201
##
## $Cholesterol$Cholesterol
## [1] 1
##
## $Cholesterol$MaximumHR
## [1] -0.003431832
The left
argument controls which columns are entered in
the first argument of f
, and the right
argument controls which columns are entered into the second. In the
example, you’ll notice that the left
columns were also
included in the set of right
columns, because they are, in
fact, numeric()
. If you didn’t want this, you can omit the
right
argument, which will then include everything not in
left
as the second argument of f
:
heart_disease %>%
dplyr::select(where(is.numeric)) %>% #Need to do this so only numeric columns are evaluated
dish(
f = cor,
left = c(BP, Cholesterol)
)
## $BP
## $BP$Age
## [1] 0.2849459
##
## $BP$MaximumHR
## [1] -0.04535088
##
##
## $Cholesterol
## $Cholesterol$Age
## [1] 0.2089503
##
## $Cholesterol$MaximumHR
## [1] -0.003431832
Now lets suppose you want to regress both blood pressure and
cholesterol on all other variables in the data set. The
each_
arguments allow you to control whether the column
sets are entered into the function individually as vectors, or together
in a single data frame. The former is the default, so you’ll need to use
this argument here:
heart_disease %>%
dish(
f = function(y, x) lm(y ~ ., data = x),
left = c(BP, Cholesterol),
each_right = FALSE
)
## $BP
##
## Call:
## lm(formula = y ~ ., data = x)
##
## Coefficients:
## (Intercept) Age
## 97.09264 0.50748
## SexMale ChestPainAtypical angina
## -3.95940 -9.84788
## ChestPainNon-anginal pain ChestPainAsymptomatic
## -9.56350 -10.11788
## BloodSugarTRUE MaximumHR
## 6.70106 0.09688
## ExerciseInducedAnginaYes HeartDiseaseYes
## 1.72906 6.00819
##
##
## $Cholesterol
##
## Call:
## lm(formula = y ~ ., data = x)
##
## Coefficients:
## (Intercept) Age
## 127.5108 1.2471
## SexMale ChestPainAtypical angina
## -23.6185 8.8270
## ChestPainNon-anginal pain ChestPainAsymptomatic
## 5.7660 8.0778
## BloodSugarTRUE MaximumHR
## -0.7327 0.3491
## ExerciseInducedAnginaYes HeartDiseaseYes
## 7.8039 12.5303
stratiply()
streamlines the familiar
split()
then purrr::map()
approach by making
it simple to select the stratification columns, and apply a function to
each subset. Let’s run a multiple logistic regression model using heart
disease as the outcome, stratified by sex:
heart_disease %>%
stratiply(
f = glm,
by = Sex,
formula = HeartDisease ~ . -ChestPain,
family = "binomial"
)
## $Female
##
## Call: .f(formula = ..1, family = "binomial", data = .x[[i]])
##
## Coefficients:
## (Intercept) Age BP
## -6.95485 0.03362 0.04366
## Cholesterol BloodSugarTRUE MaximumHR
## 0.00354 0.47028 -0.02465
## ExerciseInducedAnginaYes
## 2.12039
##
## Degrees of Freedom: 96 Total (i.e. Null); 90 Residual
## Null Deviance: 110.7
## Residual Deviance: 76.21 AIC: 90.21
##
## $Male
##
## Call: .f(formula = ..1, family = "binomial", data = .x[[i]])
##
## Coefficients:
## (Intercept) Age BP
## 1.877142 0.024853 0.007710
## Cholesterol BloodSugarTRUE MaximumHR
## 0.008718 -0.390310 -0.042231
## ExerciseInducedAnginaYes
## 1.106387
##
## Degrees of Freedom: 205 Total (i.e. Null); 199 Residual
## Null Deviance: 283.2
## Residual Deviance: 211.2 AIC: 225.2
Adding multiple stratification columns will produce a deeper list:
heart_disease %>%
stratiply(
f = glm,
by = c(Sex, ExerciseInducedAngina),
formula = HeartDisease ~ . -ChestPain,
family = "binomial"
)
## $Female
## $Female$No
##
## Call: .f(formula = ..1, family = "binomial", data = .x[[i]])
##
## Coefficients:
## (Intercept) Age BP Cholesterol BloodSugarTRUE
## -9.58123 0.01027 0.07213 0.00406 0.65807
## MaximumHR
## -0.02540
##
## Degrees of Freedom: 74 Total (i.e. Null); 69 Residual
## Null Deviance: 62.53
## Residual Deviance: 49.93 AIC: 61.93
##
## $Female$Yes
##
## Call: .f(formula = ..1, family = "binomial", data = .x[[i]])
##
## Coefficients:
## (Intercept) Age BP Cholesterol BloodSugarTRUE
## 3.850121 0.049450 0.012214 0.001458 0.945153
## MaximumHR
## -0.056538
##
## Degrees of Freedom: 21 Total (i.e. Null); 16 Residual
## Null Deviance: 28.84
## Residual Deviance: 23.36 AIC: 35.36
##
##
## $Male
## $Male$No
##
## Call: .f(formula = ..1, family = "binomial", data = .x[[i]])
##
## Coefficients:
## (Intercept) Age BP Cholesterol BloodSugarTRUE
## 2.728309 0.053058 -0.003653 0.005387 -1.106214
## MaximumHR
## -0.042036
##
## Degrees of Freedom: 128 Total (i.e. Null); 123 Residual
## Null Deviance: 174
## Residual Deviance: 142.3 AIC: 154.3
##
## $Male$Yes
##
## Call: .f(formula = ..1, family = "binomial", data = .x[[i]])
##
## Coefficients:
## (Intercept) Age BP Cholesterol BloodSugarTRUE
## 0.70070 -0.01348 0.03561 0.01342 1.09404
## MaximumHR
## -0.04531
##
## Degrees of Freedom: 76 Total (i.e. Null); 71 Residual
## Null Deviance: 75.94
## Residual Deviance: 60.53 AIC: 72.53
typly()
allows you to apply a function to columns of a
data frame whose type inherits at least one (or none) of the specified
candidates. It is similar to purrr::map_if()
, but uses
methods::is()
for determining types (see
some_type()
), and only returns the results for the selected
columns:
## $Age
## [1] 54.43894
##
## $BP
## [1] 131.6898
##
## $Cholesterol
## [1] 246.6931
##
## $BloodSugar
## [1] 0.1485149
##
## $MaximumHR
## [1] 149.6073
You can use the negated
argument to apply the function
to columns that are not any of the listed types:
heart_disease %>%
typly(
f = table,
types = c("numeric", "logical"),
negated = TRUE,
useNA = "always"
)
## $Sex
##
## Female Male <NA>
## 97 206 0
##
## $ChestPain
##
## Typical angina Atypical angina Non-anginal pain Asymptomatic
## 23 50 86 144
## <NA>
## 0
##
## $ExerciseInducedAngina
##
## No Yes <NA>
## 204 99 0
##
## $HeartDisease
##
## No Yes <NA>
## 164 139 0
absorb()
allows you to create collections of strings
that use keys as placeholders, which are then populated by the values.
This is useful for setting up results of your analysis to be presented
in a specific format that is independent of the data set at hand. Here’s
a simple example:
absorb(
key = c("mean", "sd", "var"),
value = c("10", "2", "4"),
text =
c(
"MEAN: mean, SD: sd",
"VAR: var = sd^2",
MEAN = "mean"
)
)
## MEAN
## "MEAN: 10, SD: 2" "VAR: 4 = 2^2" "10"
The input text
is scanned to look for the keys
(interpreted as regular expressions) and are replaced with the
corresponding values.
Let’s look at a more useful example. Suppose we have a collection summary statistics for patient age by angina and heart disease status:
age_stats <-
heart_disease %>%
dplyr::group_by(
ExerciseInducedAngina,
HeartDisease
) %>%
dplyr::summarise(
mean = round(mean(Age), 2),
sd = round(sd(Age), 2),
median = median(Age),
iqr = IQR(Age),
.groups = "drop"
) %>%
tidyr::gather(
key = "key",
value = "value",
-ExerciseInducedAngina,
-HeartDisease
)
age_stats
## # A tibble: 16 × 4
## ExerciseInducedAngina HeartDisease key value
## <fct> <fct> <chr> <dbl>
## 1 No No mean 52.4
## 2 No Yes mean 57.1
## 3 Yes No mean 53.6
## 4 Yes Yes mean 56.2
## 5 No No sd 9.68
## 6 No Yes sd 7.56
## 7 Yes No sd 8.54
## 8 Yes Yes sd 8.27
## 9 No No median 52
## 10 No Yes median 58
## 11 Yes No median 53
## 12 Yes Yes median 57
## 13 No No iqr 15
## 14 No Yes iqr 10
## 15 Yes No iqr 12.5
## 16 Yes Yes iqr 8.25
Next, you can specify the string format you want to nicely summarize the information in each group:
age_stats %>%
dplyr::group_by(
ExerciseInducedAngina,
HeartDisease
) %>%
dplyr::summarise(
Summary =
absorb(
key = key,
value = value,
text =
c(
"mean (sd) | median (iqr)"
)
),
.groups = "drop"
)
## # A tibble: 4 × 3
## ExerciseInducedAngina HeartDisease Summary
## <fct> <fct> <chr>
## 1 No No 52.42 (9.68) | 52 (15)
## 2 No Yes 57.1 (7.56) | 58 (10)
## 3 Yes No 53.61 (8.54) | 53 (12.5)
## 4 Yes Yes 56.24 (8.27) | 57 (8.25)
Of course, this is much more useful when the summary data is already
in the format of age_stats
.
In the case where the key pattern found in the string template is repeated, its values are collapsed into a concatenated string:
## [1] "(52.42_57.1_53.61_56.24) / (9.68_7.56_8.54_8.27)"
## [2] "52_58_53_57"
The sep
argument can be used to customize how values are
separated.
It may be useful in some cases to evaluate the resulting string as an expression. You can setup the prior example so that the result contains valid expressions:
absorb(
key = age_stats$key,
value = age_stats$value,
text = c("(mean) / (sd)", "median"),
sep = "+",
evaluate = TRUE,
trace = TRUE
)
## (mean) / (sd) median
## (mean) / (sd) median
## (52.42+57.1+53.61+56.24) / (sd) median
## (52.42+57.1+53.61+56.24) / (sd) 52+58+53+57
## [[1]]
## [1] 6.442584
##
## [[2]]
## [1] 220
These statistics are not entirely useful here, but you get the point.
depths()
and depths_string()
are used for
traversing a list structure to find the elements that satisfy a
predicate. The former produces a vector of the unique depths that
contain at least one element where predicate
is true, and
the latter creates a string representation of the traversal with the
actual positions.
#Make a divided data frame
div_dat1 <-
heart_disease %>%
divide(
Sex,
HeartDisease
)
#Find the depths of the data frames
div_dat1 %>%
depths(
predicate = is.data.frame
)
## [1] 2
div_dat1 %>%
depths_string(
predicate = is.data.frame
)
## [1] "{1{-1,-2},2{-1,-2}}"
In the string result, the brackets represent the level of the list,
and the integers represent the index at that level, which are negative
if predicate
is true for that element.
By default, the algorithm continues when
rlang::is_bare_list()
so that the traversal can end with
list-like objects. However, the bare
argument can be used
to traverse deeper into the list:
div_dat1 %>%
depths_string(
predicate = is.data.frame,
bare = FALSE
)
## [1] "{1{-1{1,2,3,4,5,6,7},-2{1,2,3,4,5,6,7}},2{-1{1,2,3,4,5,6,7},-2{1,2,3,4,5,6,7}}}"
Now it also evaluated the columns of each data frame in the list, though it still found the correct positions where the predicate held.
muddle()
can be used to randomly shuffle columns in a
data frame. This is a convenient way to remove confounding when
exploring the effects of a variable on an outcome.
## # A tibble: 303 × 9
## Age Sex ChestPain BP Cholest…¹ Blood…² Maxim…³ Exerc…⁴ Heart…⁵
## <dbl> <fct> <fct> <dbl> <dbl> <lgl> <dbl> <fct> <fct>
## 1 43 Female Non-anginal pain 130 214 FALSE 120 Yes No
## 2 44 Male Asymptomatic 130 204 FALSE 143 Yes Yes
## 3 68 Female Asymptomatic 128 242 FALSE 125 Yes No
## 4 35 Female Asymptomatic 120 269 FALSE 163 Yes Yes
## 5 45 Female Atypical angina 138 240 FALSE 169 No No
## 6 54 Male Asymptomatic 128 209 FALSE 182 Yes No
## 7 61 Male Asymptomatic 100 258 FALSE 152 Yes Yes
## 8 57 Female Asymptomatic 152 229 FALSE 142 No No
## 9 67 Male Non-anginal pain 110 283 FALSE 138 No Yes
## 10 51 Female Atypical angina 125 204 TRUE 161 No No
## # … with 293 more rows, and abbreviated variable names ¹Cholesterol,
## # ²BloodSugar, ³MaximumHR, ⁴ExerciseInducedAngina, ⁵HeartDisease
All columns are permuted by default. Use the at
argument
to only shuffle certain ones:
## # A tibble: 303 × 9
## Age Sex ChestPain BP Cholest…¹ Blood…² Maxim…³ Exerc…⁴ Heart…⁵
## <dbl> <fct> <fct> <dbl> <dbl> <lgl> <dbl> <fct> <fct>
## 1 47 Male Typical angina 145 233 TRUE 150 No No
## 2 49 Male Asymptomatic 160 286 FALSE 108 Yes Yes
## 3 59 Male Asymptomatic 120 229 FALSE 129 Yes Yes
## 4 35 Male Non-anginal pain 130 250 FALSE 187 No No
## 5 44 Female Atypical angina 130 204 FALSE 172 No No
## 6 29 Male Atypical angina 120 236 FALSE 178 No No
## 7 45 Female Asymptomatic 140 268 FALSE 160 No Yes
## 8 59 Female Asymptomatic 120 354 FALSE 163 Yes No
## 9 46 Male Asymptomatic 130 254 FALSE 147 No Yes
## 10 54 Male Asymptomatic 140 203 TRUE 155 Yes Yes
## # … with 293 more rows, and abbreviated variable names ¹Cholesterol,
## # ²BloodSugar, ³MaximumHR, ⁴ExerciseInducedAngina, ⁵HeartDisease
Additional arguments can be passed to sample()
as well.
For example, you might want five random values from each column:
## # A tibble: 5 × 9
## Age Sex ChestPain BP Choleste…¹ Blood…² Maxim…³ Exerc…⁴ Heart…⁵
## <dbl> <fct> <fct> <dbl> <dbl> <lgl> <dbl> <fct> <fct>
## 1 54 Female Asymptomatic 136 275 TRUE 163 No No
## 2 62 Male Asymptomatic 125 271 FALSE 195 No No
## 3 52 Male Non-anginal pain 150 286 FALSE 105 No No
## 4 64 Male Asymptomatic 106 273 FALSE 163 Yes No
## 5 54 Male Atypical angina 120 199 FALSE 182 Yes Yes
## # … with abbreviated variable names ¹Cholesterol, ²BloodSugar, ³MaximumHR,
## # ⁴ExerciseInducedAngina, ⁵HeartDisease
stretch()
is for spanning keys and values across the
columns. It is similar to tidyr::spread()
, but allows for
any number of keys and values to be selected. It’s functionality is more
so targeted at setting up your results to be presented in a table,
rather than for general data manipulation. Thus, the resulting column
names and orderings are setup to make it a seamless transition.
To illustrate, lets first collect the parameter estimates and standard errors from multiple regression models using blood pressure and cholesterol as outcomes, stratified by sex:
mod_results <-
heart_disease %>%
#For each sex
stratiply(
by = Sex,
f =
~.x %>%
#Collect coefficients and standard errors for model estimates on multiple outcomes
dish(
f = function(y, x) {
model <- lm(y ~ ., data = x)
tibble::tibble(
Parameter = names(model$coefficients),
Estimate = model$coefficients,
SE = sqrt(diag(vcov(model)))
)
},
left = c(BP, Cholesterol),
each_right = FALSE
)
) %>%
#Gather results into a single data frame
fasten(
into = c("Sex", "Outcome")
)
mod_results
## # A tibble: 36 × 5
## Sex Outcome Parameter Estimate SE
## <chr> <chr> <chr> <dbl> <dbl>
## 1 Female BP (Intercept) 93.7 24.7
## 2 Female BP Age 0.533 0.210
## 3 Female BP ChestPainAtypical angina -16.3 9.73
## 4 Female BP ChestPainNon-anginal pain -15.3 9.15
## 5 Female BP ChestPainAsymptomatic -14.2 9.64
## 6 Female BP BloodSugarTRUE 6.92 5.53
## 7 Female BP MaximumHR 0.123 0.0993
## 8 Female BP ExerciseInducedAnginaYes 8.00 4.89
## 9 Female BP HeartDiseaseYes 12.1 5.21
## 10 Female Cholesterol (Intercept) -12.1 91.6
## # … with 26 more rows
Now lets span the estimates and standard errors across the columns for both outcomes:
## # A tibble: 18 × 6
## Sex Parameter BP_Estimate BP_SE Cholesterol_Es…¹ Chole…²
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Female (Intercept) 93.7 24.7 -12.1 91.6
## 2 Female Age 0.533 0.210 2.30 0.779
## 3 Female BloodSugarTRUE 6.92 5.53 24.6 20.6
## 4 Female ChestPainAsymptomatic -14.2 9.64 34.0 35.8
## 5 Female ChestPainAtypical angina -16.3 9.73 22.7 36.1
## 6 Female ChestPainNon-anginal pain -15.3 9.15 34.1 34.0
## 7 Female ExerciseInducedAnginaYes 8.00 4.89 8.14 18.2
## 8 Female HeartDiseaseYes 12.1 5.21 5.88 19.3
## 9 Female MaximumHR 0.123 0.0993 0.720 0.369
## 10 Male (Intercept) 105. 14.7 151. 38.7
## 11 Male Age 0.480 0.142 0.765 0.374
## 12 Male BloodSugarTRUE 4.96 3.12 -6.85 8.23
## 13 Male ChestPainAsymptomatic -10.0 4.25 3.38 11.2
## 14 Male ChestPainAtypical angina -8.61 4.68 9.55 12.3
## 15 Male ChestPainNon-anginal pain -6.99 4.31 -0.802 11.4
## 16 Male ExerciseInducedAnginaYes -1.08 2.78 6.88 7.33
## 17 Male HeartDiseaseYes 3.07 2.80 13.4 7.39
## 18 Male MaximumHR 0.0392 0.0601 0.239 0.158
## # … with abbreviated variable names ¹Cholesterol_Estimate, ²Cholesterol_SE
The sep
argument controls how the new column names are
concatenated.
 It can just be added to the keys:
## # A tibble: 9 × 9
## Parameter Femal…¹ Femal…² Femal…³ Femal…⁴ Male_B…⁵ Male_…⁶ Male_…⁷ Male_…⁸
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 93.7 24.7 -12.1 91.6 105. 14.7 151. 38.7
## 2 Age 0.533 0.210 2.30 0.779 0.480 0.142 0.765 0.374
## 3 BloodSugarTR… 6.92 5.53 24.6 20.6 4.96 3.12 -6.85 8.23
## 4 ChestPainAsy… -14.2 9.64 34.0 35.8 -10.0 4.25 3.38 11.2
## 5 ChestPainAty… -16.3 9.73 22.7 36.1 -8.61 4.68 9.55 12.3
## 6 ChestPainNon… -15.3 9.15 34.1 34.0 -6.99 4.31 -0.802 11.4
## 7 ExerciseIndu… 8.00 4.89 8.14 18.2 -1.08 2.78 6.88 7.33
## 8 HeartDisease… 12.1 5.21 5.88 19.3 3.07 2.80 13.4 7.39
## 9 MaximumHR 0.123 0.0993 0.720 0.369 0.0392 0.0601 0.239 0.158
## # … with abbreviated variable names ¹Female_BP_Estimate, ²Female_BP_SE,
## # ³Female_Cholesterol_Estimate, ⁴Female_Cholesterol_SE, ⁵Male_BP_Estimate,
## # ⁶Male_BP_SE, ⁷Male_Cholesterol_Estimate, ⁸Male_Cholesterol_SE
Notice how the resulting columns are positioned. They are
sequentially sorted starting with the outer-most key in a hierarchical
manner. Since there are multiple value
columns in this
example, their names are also appended to the result in the order in
which they were requested.
grable()
stands for “graded table”. It is used to stack
headers into a knitr::kable()
in an automated fashion by
iteratively parsing the column names by the specified delimiter. The
result of stretch()
was purposely made to flow directly
into this function.
| Sex | Parameter | Estimate | SE | Estimate | SE |
|---|---|---|---|---|---|
| Female | (Intercept) | 93.7187493 | 24.6536900 | -12.1297785 | 91.6044593 |
| Female | Age | 0.5330329 | 0.2096016 | 2.2975419 | 0.7788061 |
| Female | BloodSugarTRUE | 6.9178015 | 5.5329199 | 24.5796821 | 20.5583885 |
| Female | ChestPainAsymptomatic | -14.1810178 | 9.6423236 | 34.0195680 | 35.8274902 |
| Female | ChestPainAtypical angina | -16.3247037 | 9.7289213 | 22.6736038 | 36.1492568 |
| Female | ChestPainNon-anginal pain | -15.3471449 | 9.1541813 | 34.1239627 | 34.0137249 |
| Female | ExerciseInducedAnginaYes | 7.9952541 | 4.8947727 | 8.1371920 | 18.1872573 |
| Female | HeartDiseaseYes | 12.0913966 | 5.2058240 | 5.8795266 | 19.3430149 |
| Female | MaximumHR | 0.1226586 | 0.0992801 | 0.7201695 | 0.3688901 |
| Male | (Intercept) |<PHONE_NUMBER> | 14.6933205 |<PHONE_NUMBER> | 38.7467039 |
| Male | Age | 0.4800104 | 0.1417168 | 0.7654107 | 0.3737111 |
| Male | BloodSugarTRUE | 4.9616363 | 3.1197639 | -6.8540853 | 8.2269061 |
| Male | ChestPainAsymptomatic | -10.0474949 | 4.2547960 | 3.3795322 | 11.2200180 |
| Male | ChestPainAtypical angina | -8.6148546 | 4.6798629 | 9.5540927 | 12.3409315 |
| Male | ChestPainNon-anginal pain | -6.9875791 | 4.3056911 | -0.8015539 | 11.3542299 |
| Male | ExerciseInducedAnginaYes | -1.0827067 | 2.7780388 | 6.8846691 | 7.3257672 |
| Male | HeartDiseaseYes | 3.0740495 | 2.8029917 | 13.4020228 | 7.3915687 |
| Male | MaximumHR | 0.0391572 | 0.0600935 | 0.2387579 | 0.1584683 |
The at
argument specifies which columns should be
spanned in the header. Let’s try it with the two-key example from
above:
| Parameter | Estimate | SE | Estimate | SE | Estimate | SE | Estimate | SE |
|---|---|---|---|---|---|---|---|---|
| (Intercept) | 93.7187493 | 24.6536900 | -12.1297785 | 91.6044593 |<PHONE_NUMBER> | 14.6933205 |<PHONE_NUMBER> | 38.7467039 |
| Age | 0.5330329 | 0.2096016 | 2.2975419 | 0.7788061 | 0.4800104 | 0.1417168 | 0.7654107 | 0.3737111 |
| BloodSugarTRUE | 6.9178015 | 5.5329199 | 24.5796821 | 20.5583885 | 4.9616363 | 3.1197639 | -6.8540853 | 8.2269061 |
| ChestPainAsymptomatic | -14.1810178 | 9.6423236 | 34.0195680 | 35.8274902 | -10.0474949 | 4.2547960 | 3.3795322 | 11.2200180 |
| ChestPainAtypical angina | -16.3247037 | 9.7289213 | 22.6736038 | 36.1492568 | -8.6148546 | 4.6798629 | 9.5540927 | 12.3409315 |
| ChestPainNon-anginal pain | -15.3471449 | 9.1541813 | 34.1239627 | 34.0137249 | -6.9875791 | 4.3056911 | -0.8015539 | 11.3542299 |
| ExerciseInducedAnginaYes | 7.9952541 | 4.8947727 | 8.1371920 | 18.1872573 | -1.0827067 | 2.7780388 | 6.8846691 | 7.3257672 |
| HeartDiseaseYes | 12.0913966 | 5.2058240 | 5.8795266 | 19.3430149 | 3.0740495 | 2.8029917 | 13.4020228 | 7.3915687 |
| MaximumHR | 0.1226586 | 0.0992801 | 0.7201695 | 0.3688901 | 0.0391572 | 0.0600935 | 0.2387579 | 0.1584683 |
The tables can then be piped through subsequent customized processing
with kableExtra
tools.
descriptives()
produces a data frame in long format with
a collection of descriptive statistics.
heart_disease %>%
descriptives()
## # A tibble: 111 × 9
## fun_eval fun_key col_ind col_lab val_ind val_lab val_dbl val_chr val_cbn
## <chr> <chr> <int> <chr> <int> <chr> <dbl> <chr> <chr>
## 1 all available 1 Age 1 NA 303 NA 303
## 2 all available 2 Sex 1 NA 303 NA 303
## 3 all available 3 ChestPain 1 NA 303 NA 303
## 4 all available 4 BP 1 NA 303 NA 303
## 5 all available 5 Cholester… 1 NA 303 NA 303
## 6 all available 6 BloodSugar 1 NA 303 NA 303
## 7 all available 7 MaximumHR 1 NA 303 NA 303
## 8 all available 8 ExerciseI… 1 NA 303 NA 303
## 9 all available 9 HeartDise… 1 NA 303 NA 303
## 10 all class 1 Age 1 NA NA numeric numeric
## # … with 101 more rows
univariate_associations()
is a special case of
dish()
specifically for computing association metrics of
one or more responses
with a collection of
predictors
.
heart_disease %>%
univariate_associations(
f = list(AIC = function(y, x) AIC(lm(y ~ x))),
responses = c(BP, Cholesterol)
)
## # A tibble: 14 × 3
## response predictor AIC
## <chr> <chr> <dbl>
## 1 BP Age 2577.
## 2 BP Sex 2602.
## 3 BP ChestPain 2598.
## 4 BP BloodSugar 2593.
## 5 BP MaximumHR 2602.
## 6 BP ExerciseInducedAngina 2602.
## 7 BP HeartDisease 2596.
## 8 Cholesterol Age 3243.
## 9 Cholesterol Sex 3244.
## 10 Cholesterol ChestPain 3259.
## 11 Cholesterol BloodSugar 3257.
## 12 Cholesterol MaximumHR 3257.
## 13 Cholesterol ExerciseInducedAngina 3256.
## 14 Cholesterol HeartDisease 3255.
univariate_table()
allows you to create a custom
descriptive table for a data set. It uses almost every function in the
package across its span of capabilities.
heart_disease %>%
univariate_table()
| Variable | Level | Summary |
|---|---|---|
| Age | 56 (48, 61) | |
| Sex | Female | 97 (32.01%) |
| Sex | Male | 206 (67.99%) |
| ChestPain | Typical angina | 23 (7.59%) |
| ChestPain | Atypical angina | 50 (16.5%) |
| ChestPain | Non-anginal pain | 86 (28.38%) |
| ChestPain | Asymptomatic | 144 (47.52%) |
| BP | 130 (120, 140) | |
| Cholesterol | 241 (211, 275) | |
| MaximumHR | 153 (133.5, 166) | |
| ExerciseInducedAngina | No | 204 (67.33%) |
| ExerciseInducedAngina | Yes | 99 (32.67%) |
| HeartDisease | No | 164 (54.13%) |
| HeartDisease | Yes | 139 (45.87%) |
See vignette("describe")
for a more in-depth
introduction to these functions.


You can either edit or delete this film.
{{ film?.title }}
{{ film?.author }}
{{ film?.year }}
This film doesn't exist.This film has been deleted. Back to the list or add a new film ?


| Free | Basic | Plus | |
| Free | 199,00 DKK | 999,00 DKK | |
| Bid on tasks | |||
| Micro Very small tasks, typically tasks such as cleaning of an apartment, or something else small. | done | done | |
| Small Minor tasks, that does some stuff. | done | done | |
| Medium | done | done | |
| Large | done | done | |
| Extra large | done | done | |
| Profile page | Example | Example | Example |
| Basic information | done | done | done |
| Custom profile description | done | done | done |
| Widget integrations | done | done | |
| SEO optimizations & exposure | done | done | |
| Header image | Available as an upgrade | done |


I've started to do an audit and it's available here.
Also, should we move this ticket to pdc_discovery?
deployed
by None at 2023-04-06 18:45:01.referenced
by None at 2023-04-06 19:04:09.merged
by None at 2023-04-06 19:04:09.closed
by None at 2023-04-06 19:04:09.head_ref_deleted
by None at 2023-04-06 19:04:10.referenced
by Trey Pendragon at 2023-04-06 18:43:48.closed
by None at 2023-04-06 19:04:11.renamed
by Kevin Reiss at 2023-04-06 18:22:36.referenced
by Christina Chortaria at 2023-04-06 18:46:20.merged
by Christina Chortaria at 2023-04-06 18:46:20.closed
by Christina Chortaria at 2023-04-06 18:46:20.head_ref_deleted
by Christina Chortaria at 2023-04-06 18:46:21.Issue can be reproduced by exporting the CPF for https://aspace-staging.princeton.edu/staff/agents/agent_person/10748 and https://aspace.princeton.edu/staff/agents/agent_person/10748 respectively.
I've emailed Lyrasis to ask whether it is possible that, despite both servers being on the same version, the exporter on staging could be behind.
Aha! This is a CVL issue. The value as entered from the drop-down is mapped to the controlled values allowed by the CPF schema. CPF requires them to be upper case, whereas our CVL maps them to the correct, but lower-case values.
It turns out we have a locales file only on staging that overrides the mapping. Lyrasis is going to delete it for us; changes should take effect after a re-start tonight.
assigned
by None at 2023-04-06 11:59:43.labeled
by None at 2023-04-06 16:50:45.update: refid is still locked for editing via UI and API
I've asked Lyrasis
assigned
by None at 2023-04-06 16:39:32.labeled
by None at 2023-04-06 16:50:57.review_requested
by Max Kadel at 2023-04-06 13:44:48.referenced
by Jane Sandberg at 2023-04-06 14:21:25.merged
by Jane Sandberg at 2023-04-06 14:21:25.closed
by Jane Sandberg at 2023-04-06 14:21:25.head_ref_deleted
by Jane Sandberg at 2023-04-06 14:21:26.closed
by Kevin Reiss at 2023-04-06 15:08:37.reopened
by Max Kadel at 2023-04-06 17:33:48.closed
by Max Kadel at 2023-04-06 17:35:20.assigned
by None at 2023-04-06 17:40:09.We found that non-MVWs have a value for iiiftilesource once they're saved by trevor, but MVWs do not. This makes https://github.com/projectblacklight/spotlight/blob/main/app/views/spotlight/sirtrevor/blocks/solrdocumentscarouselblock.html.erb#L13 work for non-mvws, and a larger image is displayed. Note that neither is getting the fullimageurl value.
That all happens in https://github.com/projectblacklight/spotlight/blob/main/app/javascript/spotlight/admin/iiif.js
But it seems too hard to make that work for MVWs. We're already doing it on the ruby side, so let's use what we already have.
Plan:
fl
to the setting as seen in https://github.com/projectblacklight/spotlight/blob/a29b6bd3dc1e97fcc8f49a0273c90516af4d3f49/lib/generators/spotlight/templates/config/initializers/spotlightinitializer.rb#L32referenced
by None at 2023-04-06 19:47:40.referenced
by None at 2023-04-06 19:48:09.referenced
by None at 2023-04-07 00:21:25.@kelea99 This should be fixed. If you find that there are still issues, please re-open.
https://dpul.princeton.edu/korean-textbooks/catalog/dc8049gh066
closed
by Eliot Jordan at 2023-04-06 17:03:58.mentioned
by Kim Leaman at 2023-04-06 17:03:58.subscribed
by Kim Leaman at 2023-04-06 17:03:58.labeled
by Eliot Jordan at 2023-04-06 18:26:00.labeled
by Eliot Jordan at 2023-04-06 18:26:00.renamed
by Eliot Jordan at 2023-04-06 18:27:16.referenced
by Trey Pendragon at 2023-04-06 21:01:28.merged
by Trey Pendragon at 2023-04-06 21:01:28.closed
by Trey Pendragon at 2023-04-06 21:01:28.head_ref_deleted
by Trey Pendragon at 2023-04-06 21:01:29.head_ref_force_pushed
by None at 2023-04-07 00:21:26.You're welcome, thank you again.
Just to ensure that the activity on this issue is logged, this bug was related to a misconfigured workflow step applied to the parent Collection. The Accept/Reject step must be deleted.
This has occurred elsewhere, and much of this configuration has been either inherited from the legacy system (which was migrated from the original OIT infrastructure), or, it is possible that during the migration certain configuration settings may not have been properly set for the new deployments.
Computational Sciences was one that was created recently so it's possible that I made the mistake, so I will take onus on my error. It was one of the first collections that I created. Though I'm not sure why PS&T is impacted here as it has been around for a while.
mentioned
by Kate Lynch at 2023-04-06 20:02:23.subscribed
by Kate Lynch at 2023-04-06 20:02:23.assigned
by Chun Ly at 2023-04-06 20:02:23.labeled
by Chun Ly at 2023-04-06 20:04:14.labeled
by Chun Ly at 2023-04-06 20:04:14.assigned
by Chun Ly at 2023-04-06 20:04:14.referenced
by Chun Ly at 2023-04-06 22:06:35.referenced
by Chun Ly at 2023-04-06 22:23:28.labeled
by Chun Ly at 2023-04-06 22:07:54.assigned
by Chun Ly at 2023-04-06 22:07:54.head_ref_force_pushed
by Chun Ly at 2023-04-06 22:23:29.referenced
by Hector Correa at 2023-04-06 17:44:42.merged
by Hector Correa at 2023-04-06 17:44:42.closed
by Hector Correa at 2023-04-06 17:44:43.@kelea99 can you please check with Alan if this is still needed? What will the label name be? example 'Find' What is the desired order of the concatenated fields. This work needs to happen in figgy.
mentioned
by Kim Leaman at 2023-04-06 13:05:56.subscribed
by Kim Leaman at 2023-04-06 13:05:56.unsubscribed
by Kim Leaman at 2023-04-06 13:14:15.mentioned
by Kim Leaman at 2023-04-06 13:21:46.subscribed
by Kim Leaman at 2023-04-06 13:21:46.transferred
by Christina Chortaria at 2023-04-06 15:58:54.Another potential use case would be for the Ephemera stakeholders to answer. we do not have a use case documented (yet), but probably worth a discussion with them too?
I think the issue here is that GraphQL is returning manifest URLs for resources that have no members. It's also true that the manifest URL should probably not return a JSON document for things without members, but I think in the current scenario if we just did that then the viewer would error and still display.
labeled
by Eliot Jordan at 2023-04-06 16:42:06.referenced
by Trey Pendragon at 2023-04-06 17:53:30.referenced
by Trey Pendragon at 2023-04-06 17:53:53.closed
by None at 2023-04-06 19:28:54.So you added the test, but it never fails? Should we note that on the test? It seems like it's giving us a false sense of security.
It failed before I switched the HTML/JSON, because it was going through the JSON logic (which renders an unauthorized)
okay! 👍🏻
excited to see this bug squashed!
ready_for_review
by Trey Pendragon at 2023-04-06 17:54:09.referenced
by None at 2023-04-06 19:28:52.merged
by None at 2023-04-06 19:28:52.closed
by None at 2023-04-06 19:28:52.head_ref_deleted
by None at 2023-04-06 19:28:53.Fixed - thanks
head_ref_force_pushed
by Trey Pendragon at 2023-04-06 19:20:57.referenced
by Eliot Jordan at 2023-04-06 20:26:14.merged
by Eliot Jordan at 2023-04-06 20:26:14.closed
by Eliot Jordan at 2023-04-06 20:26:14.head_ref_deleted
by Eliot Jordan at 2023-04-06 20:26:15.referenced
by Trey Pendragon at 2023-04-06 18:35:09.referenced
by Trey Pendragon at 2023-04-06 19:20:57.closed
by Eliot Jordan at 2023-04-06 20:26:16.closed
by Shaun Ellis at 2023-04-06 20:35:19.Informed by wireframes completed in #5395
labeled
by Shaun Ellis at 2023-04-06 20:37:04.assigned
by Shaun Ellis at 2023-04-06 20:38:41.To do:
deployed
by None at 2023-04-06 21:09:48.head_ref_force_pushed
by Trey Pendragon at 2023-04-06 21:10:17.head_ref_force_pushed
by Trey Pendragon at 2023-04-06 21:10:43.labeled
by Kevin Reiss at 2023-04-06 14:23:01.assigned
by None at 2023-04-06 13:11:10.unassigned
by None at 2023-04-06 14:54:15.assigned
by None at 2023-04-06 13:10:39.unassigned
by None at 2023-04-06 13:11:03.assigned
by None at 2023-04-06 14:57:51.Thanks @kayiwa!! 🎉
closed
by Max Kadel at 2023-04-06 21:16:56.mentioned
by Francis Kayiwa at 2023-04-06 21:17:13.subscribed
by Francis Kayiwa at 2023-04-06 21:17:13.Coverage: ?%. Remained the same when pulling b0341e718f68e27c4bda8be99fe1ff86b24e7ad9 on doc-content-warning into 11a8668c8ce89fdfe1c1f7bf188961939180a0c8 on main.
Coverage: 95.208%. Remained the same when pulling b0341e718f68e27c4bda8be99fe1ff86b24e7ad9 on doc-content-warning into 11a8668c8ce89fdfe1c1f7bf188961939180a0c8 on main.
head_ref_force_pushed
by Christina Chortaria at 2023-04-05 23:03:39.referenced
by Jane Sandberg at 2023-04-06 01:27:24.merged
by Jane Sandberg at 2023-04-06 01:27:24.closed
by Jane Sandberg at 2023-04-06 01:27:25.head_ref_deleted
by Jane Sandberg at 2023-04-06 01:27:26.closed
by Jane Sandberg at 2023-04-06 01:27:26.unassigned
by None at 2023-04-06 13:10:29.It was approved by DSSG to' Display long-form reference value'.
labeled
by Christina Chortaria at 2023-04-06 13:00:34.Since we have deleted 95% of the 856 links I think we can close this.
per @kevinreiss https://pulibrary.slack.com/archives/C031U4XCUH2/p1680272900964479
closed
by Christina Chortaria at 2023-04-06 14:59:14.mentioned
by Kevin Reiss at 2023-04-06 14:59:14.subscribed
by Kevin Reiss at 2023-04-06 14:59:15.Related or duplicate of https://github.com/pulibrary/orangelight/issues/2785
@kelea99 can we confirm if #2785 and this issue #2044 are the same?
duplicate of https://github.com/pulibrary/orangelight/issues/2785
mentioned
by Kim Leaman at 2023-04-06 14:20:13.subscribed
by Kim Leaman at 2023-04-06 14:20:13.closed
by Christina Chortaria at 2023-04-06 15:56:26.@kelea99 . I see that the fields display as they were requested.
Obverse Figure Description: figure, part, orientation, description
We display: "issueobversedescription_s": [ "Hercules, head, right, lionskin headdress" ],
We concat in the requested order: "issueobversefigures": [ "Hercules" ], "issueobverseparts": [ "head" ], "issueobverseorientations": [ "right" ], "issueobversefiguredescription_s": [ "lionskin headdress"
Reverse Figure Description: figure, part, orientation, description
We display: issuereversedescription_s": [ "Jupiter, seated, left, seated on throne, legs crossed, eagle in r. hand, sceptre in l. hand" ],
We concat in the requested order:
"issuereversefigures": [ "Jupiter" ], "issuereverseparts": [ "seated" ], "issuereverseorientations": [ "left" ], "issuereversefiguredescription_s": [ "seated on throne, legs crossed, eagle in r. hand, sceptre in l. hand" ],
This was done.
mentioned
by Kim Leaman at 2023-04-06 13:36:02.subscribed
by Kim Leaman at 2023-04-06 13:36:02.closed
by Christina Chortaria at 2023-04-06 16:03:22.need more info
@kelea99 will create a new ticket with more info.
closed
by Christina Chortaria at 2023-04-06 16:06:57.mentioned
by Kim Leaman at 2023-04-06 16:06:58.subscribed
by Kim Leaman at 2023-04-06 16:06:58.@kelea99 Information was added in https://catalog.princeton.edu/numismatics. Do we need to change/update this or is the request to add it somewhere else?
@kelea99 said to close it.
mentioned
by Kim Leaman at 2023-04-06 13:41:12.subscribed
by Kim Leaman at 2023-04-06 13:41:12.mentioned
by Kim Leaman at 2023-04-06 13:42:20.subscribed
by Kim Leaman at 2023-04-06 13:42:20.closed
by Christina Chortaria at 2023-04-06 16:08:19.mentioned
by Kim Leaman at 2023-04-06 16:08:19.subscribed
by Kim Leaman at 2023-04-06 16:08:19.labeled
by Christina Chortaria at 2023-04-06 16:11:36.renamed
by Christina Chortaria at 2023-04-06 16:22:34.Figgy is generating a iiif manifest - https://figgy.princeton.edu/concern/numismatics/coins/68015c0d-b0d8-4f69-bf2b-671646a8ebb9/manifest
@kelea99 will ask Alan if there will be metadata only with online images in the online catalog.
We need to investigate if in figgy scanned resources with no image also causes issue in the catalog. @kelea99 said this should not happen.
Figgy is generating a iiif manifest - https://figgy.princeton.edu/concern/numismatics/coins/68015c0d-b0d8-4f69-bf2b-671646a8ebb9/manifest
@maxkadel will ask in figgy channel.
mentioned
by Kim Leaman at 2023-04-06 15:41:01.subscribed
by Kim Leaman at 2023-04-06 15:41:01.mentioned
by Max Kadel at 2023-04-06 15:42:22.subscribed
by Max Kadel at 2023-04-06 15:42:23.assigned
by Max Kadel at 2023-04-06 16:57:56.referenced
by Max Kadel at 2023-04-06 21:17:36.renamed
by Eliot Jordan at 2023-04-06 19:23:25.transferred
by Eliot Jordan at 2023-04-06 19:28:10.labeled
by Kevin Reiss at 2023-04-06 20:36:24.It looks like some work has gone into making this BL8 compatible: https://github.com/projectblacklight/blacklight_range_limit/commit/5c5d649cf0e5fbd035cde365db29c063c9d899f6.
labeled
by Kevin Reiss at 2023-04-06 20:36:34.Deployed to staging 4/6/2023, 5:24 pm EST
I am able to reproduce this here - https://datacommons.princeton.edu/discovery/?f%5Bcollection_name_ssi%5D%5B%5D=Stellarators&f%5Bcommunity_root_name_ssi%5D%5B%5D=Princeton+Plasma+Physics+Laboratory
If I refresh the page repeatedly, it flaps between showing 5 and 7 results. At least one returns a "not found" error.
labeled
by Chun Ly at 2023-04-06 15:35:30.assigned
by Kate Lynch at 2023-04-06 20:49:32.labeled
by Kate Lynch at 2023-04-06 20:49:46.referenced
by Francis Kayiwa at 2023-04-05 23:53:19.merged
by Francis Kayiwa at 2023-04-05 23:53:19.closed
by Francis Kayiwa at 2023-04-05 23:53:19.head_ref_deleted
by Francis Kayiwa at 2023-04-05 23:53:20.Try running this on one of the load balancers.
referenced
by Alicia Cozine at 2023-04-06 15:29:08.merged
by Alicia Cozine at 2023-04-06 15:29:08.closed
by Alicia Cozine at 2023-04-06 15:29:08.head_ref_deleted
by Alicia Cozine at 2023-04-06 15:29:10.As of today, this works on all DLS and DACS projects. We can update as needed if any RDSS projects don't deploy.
ready_for_review
by Alicia Cozine at 2023-04-06 15:29:28.head_ref_force_pushed
by Alicia Cozine at 2023-04-06 15:30:55.head_ref_force_pushed
by Francis Kayiwa at 2023-04-06 16:07:23.head_ref_force_pushed
by Francis Kayiwa at 2023-04-06 17:27:02.assigned
by None at 2023-04-06 17:04:44.convert_to_draft
by Hector Correa at 2023-04-06 00:48:35.


Foo Hack 4.0
Partly because I haven’t been writing much CSS these days, and partly because it’s been just over a year since the last redesign, I felt like this site needed a face lift.
Fonts
I’ve been getting more and more excited about the impending freedom of the @font-face CSS declaration. The prospect using any true-type or open-type font in a web page without resorting to flash or images is incredible. If you’re viewing this site in Safari 4 or the latest beta releases of Firefox, Opera, and MSIE, you’ll have a much improved experience.
The body text is set in Bodoni SvtyTwo OS, chosen for its beautiful italics (not an oblique, but a true italic), dramatic hinting, and straightforward lines. I chose the OS over the regular Bodoni SvtyTwo because of the more stylish “lower case” numerals:<PHONE_NUMBER>.
Update: I decided to go with Hoefler Text instead of Bodoni. Bodoni looks nice, but without the stronger hinting, it was hard to read on some monitors, especially for folks who are crazy enough to browse the web on Windows. Hoefler Text has a lot of what I liked about Bodoni, and was a strong contender, but it’s not free-as-in-speech. However, it is free-as-in-MP3, so I’ll use it until Hoefler & Frere-Jones send me a C&D. I also widened the column a bit to accommodate the wider typeface.
The headings are set in Qlassik Medium, by Dimitri Castrigue. It has just enough fun to make it stand out, but not so much as to be ridiculous.
Code snippets are set in the famous Bitstream Vera Sans Mono. I’d initially planned to set all things monotype in my favorite coding font, Century Schoolbook Mono. Once you get used to coding with serifs, nothing else feels right. Unfortunately, it doesn’t include bold and italic versions. While the OS will “fake” bold and italics with fonts that it has installed, it won’t play ball when asked to manipulate dynamic fonts linked from a CSS file. I put CentSchBook Mono first, so if you have it (which you should!), it’ll work. Otherwise, you’ll get Bitstream.
If you don’t have a browser that understands dynamic fonts, you can grab them from http://foohack.com/tpl/fonts/.
Layout
I really wanted to stretch my CSS abilities a bit, and also apply some of the principles of typographic design that I’d been learning about lately. The single-column is about 66 characters wide in the target font, and feels about “right” for readability.
Despite my best intentions, a lot of feature creep had somehow taken over, prompting the last revamp. In this version, I put back some features that I’d removed, and removed some things I’d left in.
The vertical measure is set at 30px, with a font-size of 20px. While that’s a bit large, I’ve always favored erring on the side of “too big”, and the Bodoni just felt too cramped at 16/24.
I’ve also taken a lesson from the print world, and set all my bullets and other adornments off into the margins, such that the text is kept strictly flush left. The only element that I couldn’t figure out how to do this with is the <q>
element when it starts a paragraph. In that case, it should have a text-indent somewhere around -0.5ex, but I couldn’t manage to do that without borking quotes that start somewhere in the middle of the paragraph.
Since all the major browsers support resizing fonts that are set in pixels, and “zooming” is now preferred over simple font resizing, I went ahead and set everything in pixels so that the math would be easier. There’s really no benefit to so-called “fluid” layouts that are set in ex or em measurements. Plus, browsers that support dynamic fonts seem to have a really hard time with ex/em measurements, since the layout is rendered before the font has downloaded. I do hope that gets fixed at some point, but doing layout in pixels was a welcome return to basics.
Supported Browsers
The luxury of a personal site: I didn’t test even once in MSIE, and I don’t plan to.
Also, since a lot of the style is in the typography, anyone with a browser older than 6 months isn’t going to see my beautiful styles. But they’ll see their own default font settings, I suppose, and that’s probably fine.
What do you think?


MRS. DALLOWAY
A Film Review by James Berardinelli
RATING: *** OUT OF ****
United Kingdom, 1997 U.S. Release Date: 3/6/98 (limited) Running Length: 1:37 MPAA Classification: PG-13 (Mature themes, brief nudity) Theatrical Aspect Ratio: 1.85:1
Cast: Vanessa Redgrave, Natascha McElhone, Rupert Graves, Michael Kitchen, John Standing, Alan Cox, Lena Headley, Amelia Bullmore Director: Marleen Gorris Producers: Lisa Katselas Pare, Stephen Bayly Screenplay: Eileen Atkins based on the novel by Virginia Woolf Cinematography: Sue Gibson Music: Ilona Sekacz U.S. Distributor: First Look Pictures
In 1996, director Marleen Gorris, who hails from the Netherlands, entered the international spotlight when her 1995 feature, ANTONIA'S LINE, won the Best Foreign Film Oscar. Now, two years later, Gorris' follow-up to that much-lauded effort has arrived in the form of MRS. DALLOWAY, an adaptation of Virginia Woolf's classic novel. Because of its strong leading character and female-oriented themes, it's easy to understand why the film held such appeal for an avowed feminist like Gorris. In conjunction with Vanessa Redgrave, the director paints a probing-but-flawed portrait of a thoughtful woman.
Redgrave, who brings depth and a sense of poignant longing to Clarissa Dalloway, was instrumental in getting this picture made. After canvassing Virginia Woolf's body of work in preparation for a stage role, Redgrave was struck by the potential cinematic quality of MRS. DALLOWAY, and suggested to screenwriter Eileen Atkins that it would make a good movie. Several years later, the film has traversed the road from concept to feature, and, six months after making its debut at the 1997 Toronto Film Festival, it is opening in selected theaters across North America.
MRS. DALLOWAY is a "day in the life" motion picture that uses flashbacks to broaden the time span from a single day in June 1923 to a lifetime. The film begins by introducing viewers to Clarissa Dalloway, the upper class wife of Richard Dalloway (John Standing), a wealthy Member of Parliament. Clarissa, who lives a life that is safe, isolated, and dull, is planning a gala party for the evening, where guests of stature will mix and mingle, telling boring stories and engaging in stuffy conversation. Clarissa is well-known for her parties, and they have become social events in London society. Then something happens to shatter the stillness of Mrs. Dalloway's life -- a man named Peter Walsh (Michael Kitchen), an old flame from 30 years ago, shows up on her doorstep. This leads Clarissa to think back to the choices she made during the summer of 1890, and how they shaped the rest of her life.
MRS. DALLOWAY is about regrets and coping with the consequences of one's decisions. Clarissa has not led a bad life -- in fact, it has been quite comfortable -- but she is cognizant that she gave up love and passion for security. The point of the film isn't to debate whether she made the right or wrong decision, but to emphasize that everyone has roads not taken. For Clarissa, the alternative to her pampered life of parties and domestic tranquillity would have been an existence of travel and adventure, two things that frightened her. The greatest strength of MRS. DALLOWAY is that it manages to effectively capture the poignancy and wistful yearning of gazing back through the years at what was and what might have been. Clarissa's bittersweet reminiscences are so powerfully-presented that they will strike a responsive with many viewers. I left the film contemplating the undeniable truth of how quickly (and sometimes cruelly) time passes everyone by.
Juxtaposed with Mrs. Dalloway's story is that of a young, shell- shocked soldier, Septimus Warren-Smith (Rupert Graves), who has never recovered from his experiences in World War I. This material, although thematically relevant to the main plot, causes unwanted interruptions in the narrative that threaten to derail the picture. Graves plays the part effectively, and the story of the young man's loss of identity is tragic, but I found the Warren-Smith scenes to be more of a distraction than a crucial subplot.
Not surprisingly, the acting is top-notch. Redgrave shines, whether she's gazing back through the mists of the past or, in the film's best sequence, making pithy asides to expose the true nature of the guests at her party. Michael Kitchen and John Standing are solid as the two men who were once rivals for Clarissa's affections, and who have changed very little over time. In flashbacks, Natascha McElhone (SURVIVING PICASSO) brings a sparkle to the young Clarissa, and Alan Cox cuts a dashing figure as Peter. The 1890 scenes also feature Lena Headley as Clarissa's best friend, and their are hints of a subtle lesbian attraction.
MRS. DALLOWAY will probably appeal most strongly to those who appreciate Merchant-Ivory's unhurried pace. The story, which is more of a character study than a plot-oriented narrative, moves slowly and deliberately, giving us a crystal-clear picture of the many faces of Clarissa Dalloway -- who she was, who she might have been, and who she has become.
Copyright 1998 James Berardinelli
- James Berardinelli e-mail<EMAIL_ADDRESS>Now with more than 1300 reviews... The ReelViews web site: http://movie-reviews.colossus.net/
"No art passes our conscience in the way film does, and goes directly to our feelings, deep down into the dark rooms of our souls"
- Ingmar Bergman
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Substitution Key:
A Substitution cipher is a method of encoding [substituting] every plaintext character into a ciphertext character
About This Site
You must select a cipher
You must enter a key
You must fill out a message
Your Text Characters
Vigenère Cipher Key


|
SPECIAL MESSAGE
Picturing Justice was founded by Professor John Denvir and Rob Waring, and sponsored by the University of San Francisco School of Law. From 1997 to 2006 Picturing Justice published over 300 short articles on the intersection between law and lawyers on one side and popular culture on the other. While we are no longer accepting new articles, we hope readers will continue to enjoy the articles in our archives.
For articles on movies, click on "Silver Screen". For articles on television, click on "Small Screen." Articles discussing broader issues are found under "News and Views."
We dedicate this archive to the memory of webitor and contributor Paul Joseph.


In 2006, ATBS was founded and released TPMS (Tire Pressure Monitoring System). Next year, TPMS was adopted by Taiwan MaoKong gondola. One terminal host can receives signals from 1000 wheels. Afterward, we assisted the listed company to develop TPMS product. Successfully introduced the product into body shops. As the variety of products increases, we start to provide a wide range of OEM and ODM service.
2006 - 2009ATBS released series of interpreters and vehicle decoding modules in 2010. Supporting more than 5000 different kind of vehicles, such as sedans and trucks, ATBS can also customize integrating our products to your vehicles and devices (2 DINS machine, driving recorder etc...). 2011 was a big leap for ATBS. ATBS developed a sort of Interpreter Dongle / Head-Up Display(HUD), and some of them adopted to be standard equipments for lots of cars. Moreover, ATBS acquired Apple MFi License which means our product quality has been approved by Apple Inc.
2010 - 2013Since 2006, products of ATBS have been nominated as innovation award lasting for 8 years. Especially in recent years, ATBS has started to win more and more prizes in Taipei AMPA. In 2014, Thru flow TPMS External Sensor won 2014 Innovation Silver Medal Award. In 2017, Thru flow TPMS External Sensor won 2014 Innovation Silver Medal Award. Our efforts have already been valued in both the market and international trade exhibitions.
2014 - 2017Nowadays, ATBS provides both OEM and ODM services for the customers with stander safety equipment of all kinds of vehicles. ATBS have two main specialties of the core business. One is TPMS and the other is vehicle OBD II interpreters. Since 2011, ATBS has acquired the certification of Apple MFi, which set a very important milestone for ATBS not only because the quality was qualified in the market, but the products could support IOS and Android. Other than self-manufacturing products, ATBS also supports customers to integrate into different kinds of products with a sort of vehicles machine, even fleet management won't be a problem for ATBS.
2018 -Besides, the products of ATBS have been meeted lots of environmental protection regulation, vehicle testing standards and electromagnetic compatibility certifications in the world.


We'll be working with events here
Hamlet: To be or not to be?
Skull: Are you talking to me?
Hamlet: What did you say?
Skull: Nothing, I'm a figment of your imagination
Hamlet: Good! I thought I was going crazy!
I am a very lonely span


Logo
<EMAIL_ADDRESS>LogOut
Matt Tousi
Email<EMAIL_ADDRESS>Date of Birth: 12/1/1980
Relationship Status: Engaged
From: Australia
Primary Language: English
Edit profile
suggested activities to Matt
add
Activity 1
Desc Desc Desc Desc Desc Desc Desc Desc
add
Activity 1
Desc Desc Desc Desc Desc Desc Desc Desc
add
Activity 1
Desc Desc Desc Desc Desc Desc Desc Desc
add
Activity 1
Desc Desc Desc Desc Desc Desc Desc Desc
add
Activity 1
Desc Desc Desc Desc Desc Desc Desc Desc
add
Activity 1
Desc Desc Desc Desc Desc Desc Desc Desc
Suggested subjects:
Movie
Drinking


Asian markets follow Wall Street rise on US jobs data
by JOE McDONALDBEIJING (AP) - Asian stock markets followed Wall Street higher Monday after unexpectedly strong U.S. jobs data helped to soothe worries American factory activity was weaker than forecast.
Benchmarks in Shanghai, Hong Kong, South Korea and Southeast Asia advanced. Japanese markets were closed for a holiday.
The Labor Department said American employers added 128,000 jobs in October, better than the 89,000 forecast. That helped to dilute disappointment after a monthly index of manufacturing by the Institute for Supply Management, an industry group, fell for a third month and by a bigger margin than forecast.
The jobs numbers could help to reassure investors about American household spending, the main driver of the biggest global economy.
“Rolling on from the better than expected headline figure for the U.S. jobs report, Asian markets are likely to start in decent fashion this week,” said ING in a report.
The Shanghai Composite Index rose 0.6% to 2,976.46 and Hong Kong’s Hang Seng advanced 1.3% to 27,470.10. Seoul’s Kospi added 1.3% to 2,128.12.
Sydney’s S&P-ASX; 200 added 0.3% to 6,691.10. Taiwan, New Zealand and Southeast Asian markets also advanced.
On Wall Street, the benchmark Standard & Poor’s 500 rose 1% to 3,066.91 on Friday, hitting an all-time high for the third time in a week.
The Dow Jones Industrial Average gained 1.1% to 27,347.36. It is within 12 points of the record it set in July.
The Nasdaq composite gained 1.1% to 8,386.40.
Friday’s employment numbers helped to shore up investor faith that has been shaken by U.S.-China trade tension and Brexit.
The world’s largest economies have agreed to at least a temporary truce in what President Donald Trump dubbed “phase one” of a trade deal. Envoys are negotiating the details of that pact, but economists caution major issues have yet to be decided.
U.S. companies are reporting weaker profits compared with a year ago as global economic activity and consumer demand weaken.
Britain’s departure from the European Union has been delayed until at least Jan. 31 after the other 27 member governments granted London’s request for a three-month extension.
Prime Minister Boris Johnson called an election after parliament blocked his plan to leave on Oct. 31 whether the two sides agreed in advanced on their future trade and other relations or not.
France’s minister for European affairs, Amelie de Montchalin, said she is advising French companies to prepare for a scenario in which Britain leaves without a divorce deal. She told broadcaster Europe 1 radio the new date of Jan. 31 “is not negotiable.”
ENERGY: Benchmark U.S. crude lost 22 cents to $55.98 per barrel in electronic trading on the New York Mercantile Exchange. The contract jumped $2.22 on Friday to close at $56.20. Brent crude, used to price international oils, fell 31 cents to $61.38 per barrel in London. It surged $2.07 the previous session to $61.69.
CURRENCY: The dollar rose to 108.21 from Friday’s 108.18. The euro edged up to $1.1170 from $1.1168.
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.