如何在R中用here()与source()设置项目根目录并解决cmdstanr报错
问题说明
我需要在R中使用here::here()与source()函数,结合new.env()创建新环境,设置项目根目录并将数据读取至父环境,该代码将用于Stan与R的cmdstanr包交互。但我对这些函数的用法存疑,且运行代码时出现CSV文件读取报错。
虚拟数据框
tibble( Month = sample(month.name, 120, replace = TRUE), Year = sample(2012:2024, 120, replace = TRUE), Number_Daffodils = sample(1:5, 120, replace = TRUE) )
原R代码
library(here) #安装cmdstanr包 install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos"))) knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE) #创建新环境并读取数据 datenv <- new.env() source(here::here("Users/coreybrown/Documents/Dat_Frame/Data/dat.csv"), local = datenv) dat <- datenv$dat
报错信息
Error in source(here::here("Users/coreybrown/Documents/Dat_Frame/Data/dat.csv"), : /Users/coreybrown/Documents/Dat_Frame/Data/dat.csv:1:5: unexpected ',' 1: year,
实际数据框示例
year month Number_Daffodils Frequency_New_Bulbs date n_month 1 2012 January 1 7 2012-01-01 1 2 2012 February 8 59 2012-02-01 2 3 2012 April 18 144 2012-04-01 4 4 2012 May 21 193 2012-05-01 5
解决方案
1. 核心错误原因
source()是用来执行R脚本文件(.R后缀)的工具,你用它读取CSV文件时,R会把CSV的文本当成R代码解析,自然会因为逗号、列名这些非R语法报错。
2. 正确的CSV读取方式
要读取CSV文件,得用read.csv()或readr::read_csv()这类专门的文件读取函数,结合here::here()定位路径后,把数据存入新环境:
library(here) library(readr) # 可选,比base包的read.csv读写速度更快 # cmdstanr仅需安装一次,后续可注释该行 install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos"))) knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE) # 创建新环境并读取数据 datenv <- new.env() # 用read_csv读取CSV并存入新环境 datenv$dat <- read_csv(here("Data", "dat.csv")) # 将数据导入父环境 dat <- datenv$dat
3. here::here()的正确用法
here::here()是基于项目根目录(通过.Rproj文件识别)定位文件的,不需要写完整绝对路径。只要你的R项目根目录是/Users/coreybrown/Documents/Dat_Frame/,直接写here("Data", "dat.csv")就能精准定位到目标文件,不用额外写前面的用户目录路径。
4. new.env()的使用建议
你用new.env()隔离数据的思路没问题,能避免污染全局环境。但如果只是为了给cmdstanr传数据,其实可以直接读取到全局环境,或者直接把数据传入cmdstanr的采样函数,不用额外创建环境,除非你有明确的隔离需求:
# 简化版:直接读取数据 dat <- read_csv(here("Data", "dat.csv")) # 传入cmdstanr运行模型 model <- cmdstan_model("model.stan") fit <- model$sample(data = dat)
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

