WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

WIP Initial version of updated code for R transpiler - #449

Closed
rpkyle wants to merge 27 commits into
masterfrom
R
Closed

WIP Initial version of updated code for R transpiler#449
rpkyle wants to merge 27 commits into
masterfrom
R

Conversation

@rpkyle

Copy link
Copy Markdown
Contributor

No description provided.

@rpkylerpkyle changed the title Initial version of updated code for R transpilerWIP Initial version of updated code for R transpilerNov 5, 2018

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good so far, couple things to remove as I don't think they translate from python to R.

Also, I'd like those methods (and the python generation too) to be in a separate file as it should be the file for the python component class and associated methods. But that can be in another PR.

Comment threaddash/development/base_component.py Outdated
def generate_class_string_r(typename, props, description, namespace):
"""
Dynamically generate class strings to have nicely formatted docstrings,
keyword arguments, and repr

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can update this docstring to reflect that it generate R components. docstring, keywords arguments, repr are python things that may not relate to R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this makes sense. When I first started editing, I think I was trying too hard to maintain parity between the existing code and the R-related bits I introduced. I'll revise so that my additions reflect R conventions when appropriate.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. Thanks for having a look!

Comment threaddash/development/base_component.py Outdated
# whether a property is None because the user explicitly wanted
# it to be `null` or whether that was just the default value.
# The solution might be to deal with default values better although
# not all component authors will supply those.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove those comments, they contains todo's that are specifics to python classes.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do. I'll also finish commenting my additions where appropriate.

Comment threaddash/development/base_component.py Outdated
component_name=typename,
props=filtered_props,
events=parse_events(props),
description=description).replace('\r\n', '\n')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added that .replace('\r\n', '\n') for generating the docstring on windows because git doesn't auto replace them when they are in docstring. Not sure this problem is the same with R.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it is a consideration in R as well, though I think I should remove the \n and replace with a single space, since R's help viewer does its own line wrapping without adding linefeeds.

Comment threaddash/development/base_component.py Outdated
events=parse_events(props),
description=description).replace('\r\n', '\n')

# pylint: disable=unused-variable

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
'{:s}=NULL'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ This keyword list filter is for python keywords, won't be the same in R.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually now we manually maintain a file of python keywords (https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py). Perhaps we can re-name that to python_keywords and make a new one called R_keywords.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

@rpkylerpkyleNov 8, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is, if this problem even exists in R. Can you define a function with argument names that are the same as a reserved keyword in R?

If the function argument matches a reserved word (which is not first escaped with backticks), the R parser will throw an error:

Error: unexpected 'if' in "myfun <- function(if"

The help page (also produced when you type ?reserved) is here:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Reserved.html

I've gone ahead and produced a GitHub gist including reserved words in R, similar to the keyword list already available for Python. I can submit it as a pull request if it would be helpful.

https://gist.github.com/rpkyle/622155e24f603fc54a664b06f8036f3d

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can include those keywords in https://github.com/plotly/dash/blob/master/dash/development/_all_keywords.py as a new variable r_keywords and use it in this PR.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, will do.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm in the process of updating the code I've written, so please hold off on reviewing the updates to this PR for a day or so. Nicolas suggested remerging my new branch with R, so that we can keep the current PR alive.

@rpkylerpkyleNov 28, 2018

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, I think I've made the minimal sufficient set of changes required to base_component.py necessary to load dashR with the current version of dash-html-components and dash-core-components. Mind having another look at the changes?

@rmarren1
@T4rk1n

Comment threaddash/development/base_component.py Outdated
result = scope[typename]
return result

def generate_class_r(typename, props, description, namespace):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚡ the generate_class for python is for dynamically loaded components, we don't do that in R.

Comment threaddash/development/base_component.py Outdated
props = reorder_props(props=props)

desctext = ''
desctext += "\n".join(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to append, just do desctext = "\n".join(

Comment threaddash/development/component_loader.py Outdated
import collections
import json
import os
#from dash.development.base_component import generate_class

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated

from .base_component import generate_class_r
from .base_component import generate_class_file_r
#from dash.development.base_component import generate_class_file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/component_loader.py Outdated
)

# Add an import statement for this component
# RK: need to add import statements in R namespace file also

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that still todo ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added export() statements to the NAMESPACE file for the R package, don't think we'll need to provide an import statement. Will remove the comment.

Comment threaddash/development/base_component.py Outdated
[('#\' @param {:s} {:s}'.format(p, props[p]['description'].replace('\n', ' ')))
for p in props.keys()
if not p.endswith("-*") and
p not in keyword.kwlist and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/base_component.py Outdated
list_of_valid_wildcard_attr_prefixes.append(wildcard_attr[:-1])
return list_of_valid_wildcard_attr_prefixes

def parse_wildcards_r(props):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐫 I do not think this function is necessary, it is the same as parse_wildcards currently. We can keep this as one function used by the R and Python generation until we have a reason to re-write it.

Comment threaddash/development/base_component.py Outdated
return js_to_py_types[js_type_name]()
return ''

def make_package_name(namestring):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can it be make_package_name_r to be more explicit?

Comment threaddash/development/base_component.py Outdated
return ''

def make_package_name(namestring):
# first, *rest = namestring.split('_') Python 3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment threaddash/development/_all_keywords.py Outdated
# >>> import keyword
# >>> keyword.kwlist

kwlist = set([

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should change this to python_keywords then to be consistent. I think we should do it here, it's only 4 lines and I don't think it needs its own PR.


required_args = required_props(props)
return c.format(**locals())
return c.format(typename=typename,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🐱

@rpkyle

Copy link
Copy Markdown
ContributorAuthor

Closing this PR in favour of #483.

@rpkylerpkyle closed this Dec 6, 2018
@rpkyle
rpkyle deleted the R branch February 5, 2019 21:41
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rpkyle@T4rk1n@rmarren1