Closed joost-vanoverbeke closed 3 years ago
Bedankt om dit te melden. Ik vermoed dat het correct zal werken indien je in dir = ...
een absoluut path doorgeeft. Dat doe je dan best mbv rprojroot::find_root_file()
of iets dergelijks (zodat het reproduceerbaar wordt op verschillende machines).
@ElsLommelen als bovenstaande werkt, dient misschien enkel de documentatie aangepast te worden? Een andere optie is de functie gebruiksvriendelijker maken zodat het ook (?) werkt met een relatief path. Persoonlijk vermijd ik liever gebruik van relatieve paden en werk daarom meestal via rprojroot package.
Als ik daarentegen convert_docx_to_rmd(from = "090_vissen/templates/template_vissen.docx", to = "template_vissen.Rmd") run, komen de media onder de juiste directiry "090_vissen/templates/media", maar wordt de Rmd file onder mijn home folder opgeslagen.
Als je niets opgeeft bij dir
, wordt dir = "."
(current working directory). Vermits je current working directory je home folder is, was je mogelijk niet in en Rstudio project aan het werken?
Jawel hoor,
ik was in een Rstudio project aan het werken.
https://github.com/inbo/moneos/blob/joost-090-vissen/090_vissen/templates/word_naar_rmd.R
geopend op mijn pc onder het Rstudio project 'moneos'
Ik kan dit voorlopig niet reproduceren. In de volgende test lijkt mij alles te werken naar verwachting:
library(protocolhelper)
library(rprojroot)
library(fs)
setwd("C:/R/temp/test_convert_docx")
convert_docx_to_rmd(from = "SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
to = "sfp-401-nl.Rmd",
dir = find_root_file("converted", criterion = is_rstudio_project))
#> [1] "C:/R/temp/test_convert_docx/converted/sfp-401-nl.Rmd"
convert_docx_to_rmd(from = "SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
to = "sfp-401-nl.Rmd",
dir = "converted2")
#> [1] "converted2/sfp-401-nl.Rmd"
convert_docx_to_rmd(from = "SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
to = "sfp-401-nl.Rmd")
#> [1] "./sfp-401-nl.Rmd"
dir_tree()
#> .
#> +-- converted
#> | +-- media
#> | | +-- image1.png
#> | | +-- image10.png
#> | | +-- image11.emf
#> | | +-- image12.png
#> | | +-- image13.png
#> | | +-- image14.png
#> | | +-- image15.png
#> | | +-- image16.png
#> | | +-- image17.png
#> | | +-- image18.png
#> | | +-- image19.png
#> | | +-- image2.jpeg
#> | | +-- image20.png
#> | | +-- image21.png
#> | | +-- image22.png
#> | | +-- image4.png
#> | | +-- image5.png
#> | | +-- image6.jpeg
#> | | +-- image7.png
#> | | +-- image8.jpeg
#> | | \-- image9.jpeg
#> | \-- sfp-401-nl.Rmd
#> +-- converted2
#> | +-- media
#> | | +-- image1.png
#> | | +-- image10.png
#> | | +-- image11.emf
#> | | +-- image12.png
#> | | +-- image13.png
#> | | +-- image14.png
#> | | +-- image15.png
#> | | +-- image16.png
#> | | +-- image17.png
#> | | +-- image18.png
#> | | +-- image19.png
#> | | +-- image2.jpeg
#> | | +-- image20.png
#> | | +-- image21.png
#> | | +-- image22.png
#> | | +-- image4.png
#> | | +-- image5.png
#> | | +-- image6.jpeg
#> | | +-- image7.png
#> | | +-- image8.jpeg
#> | | \-- image9.jpeg
#> | \-- sfp-401-nl.Rmd
#> +-- media
#> | +-- image1.png
#> | +-- image10.png
#> | +-- image11.emf
#> | +-- image12.png
#> | +-- image13.png
#> | +-- image14.png
#> | +-- image15.png
#> | +-- image16.png
#> | +-- image17.png
#> | +-- image18.png
#> | +-- image19.png
#> | +-- image2.jpeg
#> | +-- image20.png
#> | +-- image21.png
#> | +-- image22.png
#> | +-- image4.png
#> | +-- image5.png
#> | +-- image6.jpeg
#> | +-- image7.png
#> | +-- image8.jpeg
#> | \-- image9.jpeg
#> +-- sfp-401-nl.Rmd
#> +-- SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx
#> +-- testje.R
#> \-- test_convert_docx.Rproj
Created on 2021-06-15 by the reprex package (v2.0.0)
@hansvancalster Ik vermoed dat je de map in kwestie ook moet toevoegen aan from, probeer dit eens:
library(protocolhelper)
setwd("C:/R/temp")
convert_docx_to_rmd(from = "test_convert_docx/SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
to = "sfp-401-nl.Rmd",
dir = "test_convert_docx")
Als ik daarentegen convert_docx_to_rmd(from = "090_vissen/templates/template_vissen.docx", to = "template_vissen.Rmd") run, komen de media onder de juiste directiry "090_vissen/templates/media", maar wordt de Rmd file onder mijn home folder opgeslagen.
Als je niets opgeeft bij
dir
, wordtdir = "."
(current working directory). Vermits je current working directory je home folder is, was je mogelijk niet in en Rstudio project aan het werken?
@hansvancalster Akkoord dat onder een RStudio project werken veel zou oplossen. Anderzijds is het toch niet echt logisch dat het bestand zelf opgeslagen wordt in de wd, en de folder met bijhorende figuren in de map die vermeld staat bij from. Bij voorkeur zouden die in dezelfde folder opgeslagen worden (en de map zou dus best volgens hetzelfde systeem bepaald worden)...
Ook lijkt het mij handig, moesten de figuren in het bestand relatieve paden krijgen (handig bij samenwerking via github), maar da's een andere discussie.
Als ik het docx bestand in dezelfde directory plaats waar de output naartoe wordt geschreven werkt het goed in het geval van gebruik van rprojroot (welke een absolute padverwijzing geeft), maar inderdaad bij relatieve padverwijzing loopt het dan mis:
library(protocolhelper)
library(rprojroot)
library(fs)
setwd("C:/R/temp/test_convert_docx")
convert_docx_to_rmd(
from = find_root_file(
"converted/SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
criterion = is_rstudio_project
),
to = "sfp-401-nl.Rmd",
dir = find_root_file(
"converted",
criterion = is_rstudio_project
)
)
#> [1] "C:/R/temp/test_convert_docx/converted/sfp-401-nl.Rmd"
convert_docx_to_rmd(
from = "converted2/SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
to = "sfp-401-nl.Rmd",
dir = "converted2"
)
#> [1] "converted2/sfp-401-nl.Rmd"
convert_docx_to_rmd(
from = "SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx",
to = "sfp-401-nl.Rmd"
)
#> [1] "./sfp-401-nl.Rmd"
dir_tree()
#> .
#> +-- converted
#> | +-- media
#> | | +-- image1.png
#> | | +-- image10.png
#> | | +-- image11.emf
#> | | +-- image12.png
#> | | +-- image13.png
#> | | +-- image14.png
#> | | +-- image15.png
#> | | +-- image16.png
#> | | +-- image17.png
#> | | +-- image18.png
#> | | +-- image19.png
#> | | +-- image2.jpeg
#> | | +-- image20.png
#> | | +-- image21.png
#> | | +-- image22.png
#> | | +-- image4.png
#> | | +-- image5.png
#> | | +-- image6.jpeg
#> | | +-- image7.png
#> | | +-- image8.jpeg
#> | | \-- image9.jpeg
#> | +-- sfp-401-nl.Rmd
#> | \-- SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx
#> +-- converted2
#> | +-- converted2
#> | | \-- media
#> | | +-- image1.png
#> | | +-- image10.png
#> | | +-- image11.emf
#> | | +-- image12.png
#> | | +-- image13.png
#> | | +-- image14.png
#> | | +-- image15.png
#> | | +-- image16.png
#> | | +-- image17.png
#> | | +-- image18.png
#> | | +-- image19.png
#> | | +-- image2.jpeg
#> | | +-- image20.png
#> | | +-- image21.png
#> | | +-- image22.png
#> | | +-- image4.png
#> | | +-- image5.png
#> | | +-- image6.jpeg
#> | | +-- image7.png
#> | | +-- image8.jpeg
#> | | \-- image9.jpeg
#> | +-- sfp-401-nl.Rmd
#> | \-- SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx
#> +-- media
#> | +-- image1.png
#> | +-- image10.png
#> | +-- image11.emf
#> | +-- image12.png
#> | +-- image13.png
#> | +-- image14.png
#> | +-- image15.png
#> | +-- image16.png
#> | +-- image17.png
#> | +-- image18.png
#> | +-- image19.png
#> | +-- image2.jpeg
#> | +-- image20.png
#> | +-- image21.png
#> | +-- image22.png
#> | +-- image4.png
#> | +-- image5.png
#> | +-- image6.jpeg
#> | +-- image7.png
#> | +-- image8.jpeg
#> | \-- image9.jpeg
#> +-- sfp-401-nl.Rmd
#> +-- SVP_401_VegetatieOpnamePV_Terrestrisch_v1.1.docx
#> +-- testje.R
#> \-- test_convert_docx.Rproj
Created on 2021-06-15 by the reprex package (v2.0.0)
Als ik het docx bestand in dezelfde directory plaats waar de output naartoe wordt geschreven werkt het goed in het geval van gebruik van rprojroot (welke een absolute padverwijzing geeft), maar inderdaad bij relatieve padverwijzing loopt het dan mis:
Zou dit bij een relatieve padverwijzing niet opgelost kunnen worden door er intern in de functie een absolute padverwijzing van te maken, bv. door het resultaat van getwd() te gebruiken (die je opneemt als argument in de functie)? Of werkt het in de gebruikte functie van redoc wel goed, en volstaat het om de wd door te geven in convert_docx_to_rmd()
?
@hansvancalster Akkoord dat onder een RStudio project werken veel zou oplossen. Anderzijds is het toch niet echt logisch dat het bestand zelf opgeslagen wordt in de wd, en de folder met bijhorende figuren in de map die vermeld staat bij from. Bij voorkeur zouden die in dezelfde folder opgeslagen worden (en de map zou dus best volgens hetzelfde systeem bepaald worden)
Inderdaad. Dat wordt best aangepast.
Ook lijkt het mij handig, moesten de figuren in het bestand relatieve paden krijgen (handig bij samenwerking via github), maar da's een andere discussie.
Blijkbaar is het zo dat als je met relatieve padverwijzingen werkt, de figuren in de Rmd ook met relatieve padverwijzingen aangegeven worden. Wanneer je absolute padverwijzingen gebruikt is dat niet zo. Voor de omzetting van docx protocols los ik dat op met behulp van een interne functie uit het protocolhelper package (protocolhelper:::create_from_docx). Zie https://github.com/inbo/protocolhelper/blob/cc45ba1411bffdf59f8a062fefd22880896ab747/R/create_protocol.R#L735-L736
@ElsLommelen kan jij een voorstel doen van aanpassingen?
Zou dit bij een relatieve padverwijzing niet opgelost kunnen worden door er intern in de functie een absolute padverwijzing van te maken, bv. door het resultaat van getwd() te gebruiken (die je opneemt als argument in de functie)? Of werkt het in de gebruikte functie van redoc wel goed, en volstaat het om de wd door te geven in
convert_docx_to_rmd()
?
Kan ik niet direct op antwoorden zonder te debuggen. Kan jij het bekijken? Misschien ook een optie om protocolhelper:::create_from_docx te exporteren en die te gebruiken (maar daar zitten dan wel een aantal voorafnames aan vast specifiek voor protocols, zoals aparte Rmd voor elk hoofdstuk)?
Ik zal eens uitpluizen wat de beste optie is en een voorstel doen.
Ik heb intussen kunnen achterhalen waar de problemen zitten, maar ik zie ook meerdere opties om dit op te lossen. Dus mss best even bekijken wat het handigst zou zijn.
Dus momenteel zijn er 3 argumenten om te bepalen waar de .Rmd
en /media
terechtkomen: from
, to
en dir
.
from
ingevuld is, komen .Rmd
en /media
in de folder die bij from
opgegeven isto
ingevuld is, komt .Rmd
in de in to
opgegeven plaats terecht (+ wd bij relatief path) en /media
in het path opgegeven in from
from
en dir
opgegeven zijn, komen .Rmd
en /media
terecht in het path gevormd door from
en dir
.Rmd
terecht in het path gevormd door to
en dir
, en /media
in het path gevormd door from
en dir
Dit is een vrij ingewikkelde puzzel, en vooral het feit dat bij het invullen van to
beiden op een andere plaats terechtkomen, lijkt me minder logisch voor een gebruiker. Enkele voorstellen om dit op te lossen:
to
de folder /media
telkens op dezelfde plaats als de .Rmd
laten terechtkomento
ook toelaten om een path op te geven dat gebruikt wordt om te bepalen waar de .Rmd
opgeslagen wordt, dan kan bij dir
een path opgegeven worden waar media opgeslagen wordt (als dit verschillend is van de .Rmd
). Dan zou de logica als volgt zijn:
from
blijft de situatie: alles wordt opgeslagen in dat pathfrom
en to
komt alles in het path opgegeven in to
from
en dir
komt de .Rmd
in het path opgegeven in from
en /media
in het path gevormd door from
+ dir
(of in het path dir
zou hier ook een optie zijn, al weet ik niet of we dan relatieve paden kunnen aanhouden voor de figuren).Rmd
in het path opgegeven in to
en /media
in het path gevormd door to
+ dir
(of in het path dir
zou hier ook een optie zijn, al weet ik niet of we dan relatieve paden kunnen aanhouden voor de figuren)Wat zou het meest logisch zijn en het gemakkelijkst in gebruik? (Geef gerust andere alternatieven.)
Mijn 5 cent:
from
zou geen invloed mogen hebben op waar de Rmd of media worden weggeschreven.to
enkel de naam van de Rmd opgeven zonder path (dus geen invloed waar het wordt weggeschreven). De huidige default is OK (als ik het goed heb is dat de naam van de docx overnemen).dir
path waar de output naar geschreven wordt (dus dir/*.Rmd
en dir/media/*
). De huidige default is OK (dir = ".").Dat lijkt mij het eenvoudigst. Als het echt nodig is om de media folder ergens anders terecht te laten komen, kan dat ofwel achteraf (manueel of met code), ofwel een extra argument toevoegen waarbij de default resulteert in bovenstaande.
Bedankt om deze puzzel te ontwarren @ElsLommelen !
Voor to
is de default om de naam EN path van from
over te nemen. Ik ben akkoord met die default (om ook die locatie over te nemen), maar ik vind het een beetje raar (en vooral niet intuïtief) dat bij het opgeven van een dir
hierbij het path plots een combinatie wordt van from
en dir
. Dus als je je resultaat niet wilt opslaan in een path dat begint met from
, ben je sowieso verplicht om to
op te geven, zelfs als je de naam van je docx wil behouden. En volgens de documentatie mag je daar enkel een filename opgeven (terwijl een path wel zou werken, vermoed ik), dus in dat geval moet je nog eens een extra argument dir
toevoegen als je je path anders wil dan de wd.
Om te implementeren is dat voorstel inderdaad het eenvoudigst vanuit de huidige situatie, maar voor een gebruiker is het toch wel serieus puzzelen als je niet gewoon de default wil dat je een Rmd opslaat op dezelfde plaats als waar de docx staat: je moet er sowieso aan denken om to
in te vullen, anders krijg je default je from
-path + je dir
-path. En eigenlijk is uit de documentatie ook helemaal niet duidelijk dat dit default zo gebeurt... (En mss wil je zelfs een warning geven in gevallen dat een counter-intuïtieve default gebruikt wordt?)
Volgens het KISS-principe zou ik denken: probeer die argumenten onafhankelijk te maken van elkaar. Ok om een default te hebben die gewoon alles opslaat waar ook de input staat, maar die interactie tussen to
en dir
is minder intuïtief en zou volgens mij beter vervangen door een argument dat de locatie en/of naam van de .Rmd
bepaalt (evt. 2 argumenten, of 1 dat naam en/of path kan afhandelen, dus gebruiker geeft ofwel een path (waarbij naam van from
wordt overgenomen), ofwel path + file), en liefst ook een dat de locatie van /media
bepaalt (enkel in te vullen als afwijkend van waar .Rmd
komt). Je zou die inderdaad achteraf manueel kunnen verplaatsen, maar dan moet je alle links naar figuren aanpassen terwijl pandoc_convert()
dit netjes in orde gebracht had?
Oplossing 1:
from
zou geen invloed mogen hebben op waar de Rmd of media worden weggeschreven. Is gewoon de locatie waar docx staat.to
enkel de naam van de Rmd opgeven zonder path (dus geen invloed waar het wordt weggeschreven volgens KISS principe). De huidige default is NIET OK (enkel de basename - zonder path - van de docx overnemen als default).dir
path waar de output naar geschreven wordt (dus dir/*.Rmd
en dir/media/*
). De huidige default is OK; dir = ".". Als je wil dat het weggeschreven wordt naar de locatie waar docx staat en deze is verschillend van ".", deze dan ook hier doorgeven aan dir
.dir_media
: default gelijk aan dir
. Of een ander path indien je de map media
op een andere plek wil wegschrijven Oplossing 2:
from
absoluut of relatief path naar de locatie waar docx staat.to
absoluut of relatief path dat de naam van het Rmd bestand bevat. Default kan dan gelijk zijn aan from
met .docx
vervangen door .Rmd
. to
geeft dus zowel de locatie waar het Rmd bestand geschreven wordt als de naam van dat bestand.dir_media
: default gelijk aan dirname(to)
. Of een ander path indien je de map media
op een andere plek wil wegschrijven De tweede oplossing is misschien eleganter, maar breekt een deel van de code in de create_*
functies van het package (niets onoplosbaar).
De tweede oplossing vind ik ook handiger (en vaak dichter aansluitend bij de praktijk) in de zin dat de default bij weglaten van to
(en dir
) gewoon de gegevens van from
overneemt. Dus alles wordt samen opgeslagen met de input.
Bij de eerste oplossing gaat het resultaat in de wd terechtkomen als je enkel from
invult, wat waarschijnlijk minder vaak gewenst is, omdat dit script met de routinecode vaak niet in je bookdown-folder zelf zit (vermoed ik).
Bij oplossing 2, default voor dir_media
default gelijk aan dirname(from)
als to
niet ingevuld is?
Ik heb dus een lichte voorkeur voor oplossing 2, vooral omdat de default iets praktijkgerichter ingevuld kan worden, maar ook omdat ik het handiger vind als een path en bestandsnaam in 1 argument doorgegeven kan worden (als ze beiden aangepast moeten worden).
OK, dan implementeren we oplossing 2.
Ik denk dat je de defaults bij de functie-argumenten zelf kan ingeven in plaats van ze leeg te laten. Zoiets:
function(
from,
to = sub("docx$", "Rmd", from),
dir_media = dirname(to)
) {
assertthat(is.string(from), grepl("docx$", from))
}
Ja, dat kan idd, ik vroeg me al af waarom je dit niet deed.
Ok, dan zal ik de functie in die zin aanpassen.
Opgelost in #53
in de functie convert_docx_to_rmd() lijkt er nog geen volledige afstemming waar de Rmd file wordt gesaved en waar de media files. Als ik vb. vanuit de folder (relatief tov het Rstudio project) "090_vissen/templates" convert_docx_to_rmd(from = "090_vissen/templates/template_vissen.docx", to = "template_vissen.Rmd", dir = "090_vissen/templates") run wordt de Rmd file correct onder "090_vissen/templates" gesaved, maar komen de media files onder "090_vissen/templates/090_vissen/templates/media" te staan.
Als ik daarentegen convert_docx_to_rmd(from = "090_vissen/templates/template_vissen.docx", to = "template_vissen.Rmd") run, komen de media onder de juiste directiry "090_vissen/templates/media", maar wordt de Rmd file onder mijn home folder opgeslagen.