<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def link(self):
 """Ensure that an appropriate link to the cellpy-files exists for each cell. The experiment will then contain a CellpyData object for each cell (in the cell_data_frames attribute) with only the step-table stored. Remark that running update persists the summary frames instead (or everything in case you specify all_in_memory=True). This might be considered "a strange and unexpected behaviour". Sorry """

        logging.info("[estblishing links]")
        logging.debug("checking and establishing link to data")
        cell_data_frames = dict()
        counter = 0
        errors = []
        try:
            for indx, row in self.journal.pages.iterrows():

                counter += 1
                l_txt = "starting to process file # %i (index=%s)" % (counter, indx)
                logging.debug(l_txt)
                logging.info(f"linking cellpy-file: {row.cellpy_file_names}")

                if not os.path.isfile(row.cellpy_file_names):
                    logging.error("File does not exist")
                    raise IOError

                cell_data_frames[indx] = cellreader.CellpyData(initialize=True)

                step_table = helper.look_up_and_get(
                    row.cellpy_file_names,
                    "step_table"
                )

                cell_data_frames[indx].dataset.step_table = step_table

            self.cell_data_frames = cell_data_frames

        except IOError as e:
            logging.warning(e)
            e_txt = "links not established - try update"
            logging.warning(e_txt)
            errors.append(e_txt)

        self.errors["link"] = errors