Skip to content

Commit

Permalink
[BOT]Quarto Freeze by GH actions
Browse files Browse the repository at this point in the history
  • Loading branch information
YONGHUNI committed Oct 18, 2024
1 parent 5cee8f9 commit e326ed6
Show file tree
Hide file tree
Showing 27 changed files with 16,848 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"hash": "e1bd79c01c095ee64feec27dc6a15aa8",
"result": {
"engine": "knitr",
"markdown": "---\ntitle: \"Quarto-shinylive & Quartolive Testdrive\"\nauthor: \"Yonghun Suh\"\ndate: \"Oct 17, 2024\"\ncategories: [Code]\nimage: https://hypebright.nl/wp-content/uploads/2023/09/shinylive-blog-2-930x620.png\n#engine: knitr\nformat: \n live-html:\n #resources:\n # - ./data/shinylive-sw.js\n #page-layout: full\n ##https://quarto.org/docs/authoring/article-layout.html\n toc: false\n number_sections: true\n code-copy: true\n code-fold: show\n code-tools: true\n code-overflow: scroll\n code-link: true\n number-sections: true\n toc_depth: 3\n lightbox: true\n theme:\n light: cosmo #sketchy\n dark: [cosmo, ../../misc/theme-dark.scss]\n css: ../../misc/styles.css\n#webr: \n# show-startup-message: false\nfilters:\n #- webr\n - shinylive\n \n---\n\n::: {.cell}\n\n:::\n\n\n\n\n\n# Quarto-Shinylive\n\n## Locations of Earthquakes off Fiji\n\n> The data set give the locations of 1000 seismic events of MB > 4.0. The events occurred in a cube near Fiji since 1964. There are two clear planes of seismic activity. One is a major plate junction; the other is the Tonga trench off New Zealand. These data constitute a subsample from a larger dataset of containing 5000 observations.\n\nThis is one of the Harvard PRIM-H project data sets. They in turn obtained it from Dr. John Woodhouse, Dept. of Geophysics, Harvard University.\n\n\n:::{.column-screen-inset}\n\n\n```{shinylive-r}\n#| standalone: true\n#| viewerHeight: 1000\n\n\nlibrary(shiny)\nlibrary(leaflet)\nlibrary(RColorBrewer)\n\nui <- bootstrapPage(\n tags$style(type = \"text/css\", \"html, body {width:100%;height:100%}\"),\n leafletOutput(\"map\", width = \"100%\", height = \"100%\"),\n absolutePanel(top = 10, right = 10,\n sliderInput(\"range\", \"Magnitudes\", min(quakes$mag), max(quakes$mag),\n value = range(quakes$mag), step = 0.1\n ),\n selectInput(\"colors\", \"Color Scheme\",\n rownames(subset(brewer.pal.info, category %in% c(\"seq\", \"div\")))\n ),\n checkboxInput(\"legend\", \"Show legend\", TRUE)\n )\n)\n\nserver <- function(input, output, session) {\n\n # Reactive expression for the data subsetted to what the user selected\n filteredData <- reactive({\n quakes[quakes$mag >= input$range[1] & quakes$mag <= input$range[2],]\n })\n\n # This reactive expression represents the palette function,\n # which changes as the user makes selections in UI.\n colorpal <- reactive({\n colorNumeric(input$colors, quakes$mag)\n })\n\n output$map <- renderLeaflet({\n # Use leaflet() here, and only include aspects of the map that\n # won't need to change dynamically (at least, not unless the\n # entire map is being torn down and recreated).\n leaflet(quakes) %>% addTiles() %>%\n fitBounds(~min(long), ~min(lat), ~max(long), ~max(lat))\n })\n\n # Incremental changes to the map (in this case, replacing the\n # circles when a new color is chosen) should be performed in\n # an observer. Each independent set of things that can change\n # should be managed in its own observer.\n observe({\n pal <- colorpal()\n\n leafletProxy(\"map\", data = filteredData()) %>%\n clearShapes() %>%\n addCircles(radius = ~10^mag/10, weight = 1, color = \"#777777\",\n fillColor = ~pal(mag), fillOpacity = 0.7, popup = ~paste(mag,\"진도\")\n )\n })\n\n # Use a separate observer to recreate the legend as needed.\n observe({\n proxy <- leafletProxy(\"map\", data = quakes)\n\n # Remove any existing legend, and only if the legend is\n # enabled, create a new one.\n proxy %>% clearControls()\n if (input$legend) {\n pal <- colorpal()\n proxy %>% addLegend(position = \"bottomright\",\n pal = pal, values = ~mag\n )\n }\n })\n}\n\nshinyApp(ui, server)\n\n```\nCredit: [Using Leaflet with Shiny](https://rstudio.github.io/leaflet/articles/shiny.html#modifying-existing-maps-with-leafletproxy){target=\"_blank\"}\n\n:::\n\n# Quarto-Live\n\n\n## Interactive R\n\n### Mergesort from scratch\n\nI coded this while teaching myself computer science.\n\n\nI think it is important to understand how the \"so-called\" the basis functions work when it comes to the programming.\n\nYou can play around with it. Plus, you can modify the code for a better understanding.\n\n\n\n\n::: {.cell}\n```{webr}\n### You can play ALL by YOURSELF!\n\n\nprint(\"Hello quarto-live world!\")\n\n\n\n{\n # set seed for reproducability\n set.seed(10)\n givne_num <- sample(1:999, 20)\n}\n\n\n\n\n# merge two sorted array\nmerge <- function(a, b) {\n \n # create temp array\n temp <- numeric(length(a) + length(b))\n \n \n # array a, array b, setting the init value of temp array index i \n a_i <- 1\n b_i <- 1\n temp_i <- 1\n \n \n # loop through till the index temp_i reaches length of the temp array\n for(temp_i in 1 : length(temp)) {\n \n # if\n # the index of `a` does not exceedes the length of `a`(a present)\n # a[a_i] < b[b_i] or,\n \n \n # the index of `b` does exceedes the length of `b`(i.e., b does not presnt)\n if((a_i <= length(a) &&\n a[a_i] < b[b_i]) ||\n b_i > length(b)) {\n \n \n # assign an element of `a[a_i]` into temp[a_i], then i++ the index of `a`\n temp[temp_i] <- a[a_i]\n a_i <- a_i + 1\n }\n \n # else\n else {\n \n\n # assign b[b_i] into temp[temp_i] then i++ the index\n temp[temp_i] <- b[b_i]\n b_i <- b_i + 1 \n }\n \n }\n \n # return the sorted array (part of the divided/splitted)\n return(temp)\n}\n\n\n\n\n# merge sort algorithm(splitting included) - recursive function\nmergesort <- function(arr) {\n \n\n # if length of the given array exceeds 1 then\n if(length(arr) > 1) {\n \n # 분할할 중간 지점\n # midpoint for the split\n # e.g., an array size of 5: celing(5/2) = 3\n half <- ceiling(length(arr)/2)\n \n \n # calling recursive function: split untill the single element then sort\n # 1 to midpoint\n a <- mergesort(arr[1:half])\n \n \n # midpoint+1 to last\n b <- mergesort(arr[(half+1):length(arr)])\n \n # merge two sorted array and return\n merge(a, b)\n }\n \n # if the size of the array is 1\n else {\n # just return\n return(arr)\n }\n}\n\n\n\n\nminmax <- function(arr){\n \n temp <- mergesort(arr)\n \n # mimicing Python's dictionary... then return\n return(list(\"max\" = temp[length(temp)], \"min\" = temp[1]))\n \n}\n\n# function call\noutput <- minmax(givne_num)\n\n\n\n# max\noutput$max\n\n# min\noutput$min\n\n\n\n# Use the R built-in function to check the answer\nmax(givne_num)\nmin(givne_num)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n###\n```\n:::\n\n\n\n## Non-interactive\n\n\n\n::: {.cell}\n\n```{.r .cell-code}\ncat(\"And, this is a non-interactive cell\", fill = TRUE)\n```\n\n::: {.cell-output .cell-output-stdout}\n\n```\nAnd, this is a non-interactive cell\n```\n\n\n:::\n:::\n",
"supporting": [
"index_files"
],
"filters": [
"rmarkdown/pagebreak.lua"
],
"includes": {},
"engineDependencies": {},
"preserve": {},
"postProcess": true
}
}
272 changes: 272 additions & 0 deletions .quarto/_freeze/site_libs/Proj4Leaflet-1.0.1/proj4leaflet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
(function (factory) {
var L, proj4;
if (typeof define === 'function' && define.amd) {
// AMD
define(['leaflet', 'proj4'], factory);
} else if (typeof module === 'object' && typeof module.exports === "object") {
// Node/CommonJS
L = require('leaflet');
proj4 = require('proj4');
module.exports = factory(L, proj4);
} else {
// Browser globals
if (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined')
throw 'Leaflet and proj4 must be loaded first';
factory(window.L, window.proj4);
}
}(function (L, proj4) {
if (proj4.__esModule && proj4.default) {
// If proj4 was bundled as an ES6 module, unwrap it to get
// to the actual main proj4 object.
// See discussion in https://github.com/kartena/Proj4Leaflet/pull/147
proj4 = proj4.default;
}

L.Proj = {};

L.Proj._isProj4Obj = function(a) {
return (typeof a.inverse !== 'undefined' &&
typeof a.forward !== 'undefined');
};

L.Proj.Projection = L.Class.extend({
initialize: function(code, def, bounds) {
var isP4 = L.Proj._isProj4Obj(code);
this._proj = isP4 ? code : this._projFromCodeDef(code, def);
this.bounds = isP4 ? def : bounds;
},

project: function (latlng) {
var point = this._proj.forward([latlng.lng, latlng.lat]);
return new L.Point(point[0], point[1]);
},

unproject: function (point, unbounded) {
var point2 = this._proj.inverse([point.x, point.y]);
return new L.LatLng(point2[1], point2[0], unbounded);
},

_projFromCodeDef: function(code, def) {
if (def) {
proj4.defs(code, def);
} else if (proj4.defs[code] === undefined) {
var urn = code.split(':');
if (urn.length > 3) {
code = urn[urn.length - 3] + ':' + urn[urn.length - 1];
}
if (proj4.defs[code] === undefined) {
throw 'No projection definition for code ' + code;
}
}

return proj4(code);
}
});

L.Proj.CRS = L.Class.extend({
includes: L.CRS,

options: {
transformation: new L.Transformation(1, 0, -1, 0)
},

initialize: function(a, b, c) {
var code,
proj,
def,
options;

if (L.Proj._isProj4Obj(a)) {
proj = a;
code = proj.srsCode;
options = b || {};

this.projection = new L.Proj.Projection(proj, options.bounds);
} else {
code = a;
def = b;
options = c || {};
this.projection = new L.Proj.Projection(code, def, options.bounds);
}

L.Util.setOptions(this, options);
this.code = code;
this.transformation = this.options.transformation;

if (this.options.origin) {
this.transformation =
new L.Transformation(1, -this.options.origin[0],
-1, this.options.origin[1]);
}

if (this.options.scales) {
this._scales = this.options.scales;
} else if (this.options.resolutions) {
this._scales = [];
for (var i = this.options.resolutions.length - 1; i >= 0; i--) {
if (this.options.resolutions[i]) {
this._scales[i] = 1 / this.options.resolutions[i];
}
}
}

this.infinite = !this.options.bounds;

},

scale: function(zoom) {
var iZoom = Math.floor(zoom),
baseScale,
nextScale,
scaleDiff,
zDiff;
if (zoom === iZoom) {
return this._scales[zoom];
} else {
// Non-integer zoom, interpolate
baseScale = this._scales[iZoom];
nextScale = this._scales[iZoom + 1];
scaleDiff = nextScale - baseScale;
zDiff = (zoom - iZoom);
return baseScale + scaleDiff * zDiff;
}
},

zoom: function(scale) {
// Find closest number in this._scales, down
var downScale = this._closestElement(this._scales, scale),
downZoom = this._scales.indexOf(downScale),
nextScale,
nextZoom,
scaleDiff;
// Check if scale is downScale => return array index
if (scale === downScale) {
return downZoom;
}
if (downScale === undefined) {
return -Infinity;
}
// Interpolate
nextZoom = downZoom + 1;
nextScale = this._scales[nextZoom];
if (nextScale === undefined) {
return Infinity;
}
scaleDiff = nextScale - downScale;
return (scale - downScale) / scaleDiff + downZoom;
},

distance: L.CRS.Earth.distance,

R: L.CRS.Earth.R,

/* Get the closest lowest element in an array */
_closestElement: function(array, element) {
var low;
for (var i = array.length; i--;) {
if (array[i] <= element && (low === undefined || low < array[i])) {
low = array[i];
}
}
return low;
}
});

L.Proj.GeoJSON = L.GeoJSON.extend({
initialize: function(geojson, options) {
this._callLevel = 0;
L.GeoJSON.prototype.initialize.call(this, geojson, options);
},

addData: function(geojson) {
var crs;

if (geojson) {
if (geojson.crs && geojson.crs.type === 'name') {
crs = new L.Proj.CRS(geojson.crs.properties.name);
} else if (geojson.crs && geojson.crs.type) {
crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);
}

if (crs !== undefined) {
this.options.coordsToLatLng = function(coords) {
var point = L.point(coords[0], coords[1]);
return crs.projection.unproject(point);
};
}
}

// Base class' addData might call us recursively, but
// CRS shouldn't be cleared in that case, since CRS applies
// to the whole GeoJSON, inluding sub-features.
this._callLevel++;
try {
L.GeoJSON.prototype.addData.call(this, geojson);
} finally {
this._callLevel--;
if (this._callLevel === 0) {
delete this.options.coordsToLatLng;
}
}
}
});

L.Proj.geoJson = function(geojson, options) {
return new L.Proj.GeoJSON(geojson, options);
};

L.Proj.ImageOverlay = L.ImageOverlay.extend({
initialize: function (url, bounds, options) {
L.ImageOverlay.prototype.initialize.call(this, url, null, options);
this._projectedBounds = bounds;
},

// Danger ahead: Overriding internal methods in Leaflet.
// Decided to do this rather than making a copy of L.ImageOverlay
// and doing very tiny modifications to it.
// Future will tell if this was wise or not.
_animateZoom: function (event) {
var scale = this._map.getZoomScale(event.zoom);
var northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y);
var offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center);

L.DomUtil.setTransform(this._image, offset, scale);
},

_reset: function () {
var zoom = this._map.getZoom();
var pixelOrigin = this._map.getPixelOrigin();
var bounds = L.bounds(
this._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin),
this._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin)
);
var size = bounds.getSize();

L.DomUtil.setPosition(this._image, bounds.min);
this._image.style.width = size.x + 'px';
this._image.style.height = size.y + 'px';
},

_projectedToNewLayerPoint: function (point, zoom, center) {
var viewHalf = this._map.getSize()._divideBy(2);
var newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round();
var topLeft = newTopLeft.add(this._map._getMapPanePos());

return this._transform(point, zoom)._subtract(topLeft);
},

_transform: function (point, zoom) {
var crs = this._map.options.crs;
var transformation = crs.transformation;
var scale = crs.scale(zoom);

return transformation.transform(point, scale);
}
});

L.Proj.imageOverlay = function (url, bounds, options) {
return new L.Proj.ImageOverlay(url, bounds, options);
};

return L.Proj;
}));
51 changes: 51 additions & 0 deletions .quarto/_freeze/site_libs/clipboard-0.0.1/setClipboardText.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// taken from
// https://ourcodeworld.com/articles/read/143/how-to-copy-text-to-clipboard-with-javascript-easily
function setClipboardText(text) {
var id = 'mycustom-clipboard-textarea-hidden-id';
var existsTextarea = document.getElementById(id);

if (!existsTextarea) {
console.log('Creating textarea');
var textarea = document.createElement('textarea');
textarea.id = id;
// Place in top-left corner of screen regardless of scroll position.
textarea.style.position = 'fixed';
textarea.style.top = 0;
textarea.style.left = 0;

// Ensure it has a small width and height. Setting to 1px / 1em
// doesn't work as this gives a negative w/h on some browsers.
textarea.style.width = '1px';
textarea.style.height = '1px';

// We don't need padding, reducing the size if it does flash render.
textarea.style.padding = 0;

// Clean up any borders.
textarea.style.border = 'none';
textarea.style.outline = 'none';
textarea.style.boxShadow = 'none';

// Avoid flash of white box if rendered for any reason.
textarea.style.background = 'transparent';
document.querySelector('body').appendChild(textarea);
console.log('The textarea now exists :)');
existsTextarea = document.getElementById(id);
} else {
console.log('The textarea already exists :3');
}

existsTextarea.value = text;
existsTextarea.select();

try {
var status = document.execCommand('copy');
if (!status) {
console.error('Cannot copy text');
} else {
console.log('The text is now on the clipboard');
}
} catch (err) {
console.log('Unable to copy.');
}
}
Loading

0 comments on commit e326ed6

Please sign in to comment.